쉘 스크립트 에서는 아래와 같이 특정 단어를 얻기 위해 명령을 ksh
사용하고 있습니다 .grep
$ cat file.txt
abc xyzdef.123 def.jkl mnopqrst
$ grep -o "\wdef\w" file.txt
xyzdef
def
나는 출력을 원한다 xyzdef.123
.def.jkl
.
"이 단어에 액세스할 수 있는 다른 방법이 있습니까?" 이후에는 값을 얻지 못하며 grep
정확한 단어는 모르고 grep
패턴만 알 수 있습니다. 나는 ksh
껍질 작업을하고 있습니다.
답변1
문자열 def
과 그 주위에 공백이 아닌 모든 문자만 원하는 것 같습니다. 그렇다면 다음을 사용할 수 있습니다.
$ grep -Eo '\S*def\S*' file.txt
xyzdef.123
def.jkl
공백이 아닌 GNU 패스 또는 플래그 \S
지원을 나타냅니다.grep
-E
-P
답변2
grep -o
POSIX 문자 클래스를 사용하십시오 .
grep -o '[^[:blank:]]*def[^[:blank:]]*' file.txt
이는 본질적으로테든 제안, 구문이 약간 다르지만 (및 없음 -E
). 이는 문자열 def
및 해당 문자열의 양쪽에 있는 공백이 아닌 문자와 일치합니다(공백이 아닌 문자는 공백이나 탭이 아닌 문자입니다).
또는,
tr '[:blank:]' '\n' <file | grep -F 'def'
이는 단순히 줄을 여러 줄로 나누는 것입니다. 공백으로 구분된 각 단어(여기서 "공백"은 탭 또는 공백 문자)에 대해 한 줄씩 표시됩니다. 그런 다음 생성된 행에 순수 문자열 일치를 적용하여 grep -F
관심 있는 행을 찾습니다.
\wdef\w
GNU의 패턴 grep
은 POSIX 문자 클래스 이름을 사용하는 것과 동일하며 문자열 양쪽에 영숫자 또는 밑줄이 [[:alnum:]_]def[[:alnum:]_]
필요합니다 . def
점이 영숫자 문자도 아니고 밑줄 문자도 아닙니다.
def
패턴이 줄의 시작이나 끝 부분에 나타나면 일치하지 않습니다.
답변3
시도로는 반환하려는 전체 단어를 일치시킬 수 없습니다. 플래그는 -o
정의된 grep
일치 정규식의 일부만 반환합니다. 또한 \w
POSIX 정의 확장이 아니며 grep
PCRE 구문을 지원하는 GNU 버전에서만 사용할 수 있습니다. 당신이 할 수 있는 일
grep -oP '(\w*)def[.](\w*)'
이 플래그 는 -P
GNU에서 PCRE 정규식 모드를 켜고 정의된 정규식과 일치하는 전체 단어를 반환합니다. 정규식은 일치하는 0개 이상의 영숫자 문자, 그 뒤에 리터럴 (대괄호 표현식으로 묶음), 0개 이상의 영숫자가 오는 것으로 변환됩니다.grep
-o
def
.
아래에서는 POSIX 문자 클래스를 사용하여 영숫자를 나타냅니다. 하지만 이 플래그는 -o
여전히 GNU 확장이라는 점을 기억하세요.
grep -o '\([[:alnum:]]*\)def[.]\([[:alnum:]]*\)'