단어에 점이 포함된 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

\S공백이 아닌 것을 의미하며 GNU는 또는 플래그 를 grep사용 하여 지원합니다 .-E-P

답변2

grep -oPOSIX 문자 클래스 사용 :

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

이것은 본질적으로 무엇입니까테돈이 제안한다, 비록 약간 다른 구문을 사용하지만 (그리고 no -E). 이는 문자열 def및 해당 문자열의 양쪽에 있는 공백이 아닌 문자와 일치합니다(공백이 아닌 문자는 공백이나 탭이 아닌 문자입니다).

대안적으로,

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

이것은 단지 줄을 공백으로 구분된 단어당 한 줄씩 여러 줄로 나누는 것입니다(여기서 "공백"은 탭 또는 공백 문자임). 그런 다음 생성된 줄에 일반 문자열 일치를 적용하여 grep -F관심 있는 줄을 찾습니다.


\wdef\wGNU에서 POSIX 문자 클래스 이름을 사용하는 경우 패턴 grep은 와 동일하며 [[:alnum:]_]def[[:alnum:]_]문자열 def옆에 영숫자 문자나 밑줄이 있어야 합니다. 점은 영숫자 문자도 밑줄도 아닙니다.

또한 패턴은 def줄의 시작 부분이나 끝 부분에서 발생하는 경우에도 일치하지 않습니다.

답변3

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

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

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

영숫자 문자에 POSIX 문자 클래스를 사용하는 방법은 다음과 같습니다. 하지만 플래그는 -o여전히 GNU 확장이라는 점을 기억하세요.

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

관련 정보