단어에 점을 포함한 Grep 전체 이름

단어에 점을 포함한 Grep 전체 이름

쉘 스크립트 에서는 아래와 같이 특정 단어를 얻기 위해 명령을 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 -oPOSIX 문자 클래스를 사용하십시오 .

grep -o '[^[:blank:]]*def[^[:blank:]]*' file.txt

이는 본질적으로테든 제안, 구문이 약간 다르지만 (및 없음 -E). 이는 문자열 def및 해당 문자열의 양쪽에 있는 공백이 아닌 문자와 일치합니다(공백이 아닌 문자는 공백이나 탭이 아닌 문자입니다).

또는,

tr '[:blank:]' '\n' <file | grep -F 'def'

이는 단순히 줄을 여러 줄로 나누는 것입니다. 공백으로 구분된 각 단어(여기서 "공백"은 탭 또는 공백 문자)에 대해 한 줄씩 표시됩니다. 그런 다음 생성된 행에 순수 문자열 일치를 적용하여 grep -F관심 있는 행을 찾습니다.


\wdef\wGNU의 패턴 grep은 POSIX 문자 클래스 이름을 사용하는 것과 동일하며 문자열 양쪽에 영숫자 또는 밑줄이 [[:alnum:]_]def[[:alnum:]_]필요합니다 . def점이 영숫자 문자도 아니고 밑줄 문자도 아닙니다.

def패턴이 줄의 시작이나 끝 부분에 나타나면 일치하지 않습니다.

답변3

시도로는 반환하려는 전체 단어를 일치시킬 수 없습니다. 플래그는 -o정의된 grep일치 정규식의 일부만 반환합니다. 또한 \wPOSIX 정의 확장이 아니며 grepPCRE 구문을 지원하는 GNU 버전에서만 사용할 수 있습니다. 당신이 할 수 있는 일

grep -oP '(\w*)def[.](\w*)'

이 플래그 는 -PGNU에서 PCRE 정규식 모드를 켜고 정의된 정규식과 일치하는 전체 단어를 반환합니다. 정규식은 일치하는 0개 이상의 영숫자 문자, 그 뒤에 리터럴 (대괄호 표현식으로 묶음), 0개 이상의 영숫자가 오는 것으로 변환됩니다.grep-odef.

아래에서는 POSIX 문자 클래스를 사용하여 영숫자를 나타냅니다. 하지만 이 플래그는 -o여전히 GNU 확장이라는 점을 기억하세요.

grep -o '\([[:alnum:]]*\)def[.]\([[:alnum:]]*\)' 

관련 정보