
쉘 스크립트 에서는 아래와 같이 특정 단어를 가져오는 명령을 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 -o
POSIX 문자 클래스 사용 :
grep -o '[^[:blank:]]*def[^[:blank:]]*' file.txt
이것은 본질적으로 무엇입니까테돈이 제안한다, 비록 약간 다른 구문을 사용하지만 (그리고 no -E
). 이는 문자열 def
및 해당 문자열의 양쪽에 있는 공백이 아닌 문자와 일치합니다(공백이 아닌 문자는 공백이나 탭이 아닌 문자입니다).
대안적으로,
tr '[:blank:]' '\n' <file | grep -F 'def'
이것은 단지 줄을 공백으로 구분된 단어당 한 줄씩 여러 줄로 나누는 것입니다(여기서 "공백"은 탭 또는 공백 문자임). 그런 다음 생성된 줄에 일반 문자열 일치를 적용하여 grep -F
관심 있는 줄을 찾습니다.
\wdef\w
GNU에서 POSIX 문자 클래스 이름을 사용하는 경우 패턴 grep
은 와 동일하며 [[: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:]]*\)'