$ printf 'asf .test. afd\nasaf foo-test asfdads\n'
asf .test. afd
asaf foo-test asfdads
$ printf 'asf .test. afd\nasaf foo-test asfdads\n' | grep -w test
asf .test. afd
asaf foo-test asfdads
질문: "foo-test"를 어떻게 일치시키나요? 더 정확하게,"-w"는 "-"를 구분 기호로 사용하고 "."는 사용하지 않는다고 어떻게 말할 수 있나요??
아니면, grep
이 인물이 .
만들어진 인물 중 하나라고 볼 수 있을까요?성격따라서 존재하지 않습니다.단어 경계.
와 ~ 사이에있는 test
?
아니면 grep 외에 다른 솔루션이 있습니까?
답변1
2.19 이전 버전에서 GNU는 단일 바이트 문자 숫자와 밑줄(따라서 UTF-8 로케일에서는 26+26+10+1(ASCII 문자, 숫자 및 밑줄))만 단어 구성 요소로 간주했습니다 grep
. -w
예를 들어 echo Stéphane | grep -w St
일치합니다. 이 문제는 2.19에서 수정되었습니다.
그러나 논리를 수동으로 구현할 수 있습니다.
grep -E '([^[:alnum:]_.]|^)test([^[:alnum:]_.]|$)'
앞에는 단어가 아닌 구성 요소나 줄의 시작이 있고 test
, 뒤에는 단어가 아닌 구성 요소나 줄의 끝이 옵니다.
(위의 내용은 [:alnum:]
ASCII뿐만 아니라 해당 로케일의 숫자 및 문자와 일치합니다. ASCII만 필요한 경우 로케일을 C로 수정하세요.)
주변의 단어가 아닌 구성 요소를 일치 항목에 포함시키지 않으려면(예: GNU를 사용하기 때문에 -o
) 이번에는 PCRE 정규 표현식과 유사 연산자를 사용할 수 있습니다.
grep -Po '(*UCP)(?<![\w.])test(?![\w.])'
ASCII 문자 및 숫자만 일치하도록 제거 (*UCP)
하고 추가합니다 .LC_ALL=C
(*UCP)
PCRE 라이브러리에 알리기 위해 정규 표현식의 시작 부분에 사용U̲niC̲ode 성능에 사용해야 합니다 \w
.
그렇지 않으면 \w
로케일의 영숫자 및 밑줄 문자가 일치하지만 단일 바이트 문자만 일치됩니다. ASCII 언어만 일치하므로 UTF-8 로케일(현재 표준)에서는 작동하지 않습니다. (*UCP)
UTF-8에서도 작동하도록 만드세요. 이는 PCRE 자체의 문자 속성 개념에 따라 일치하며 이는 사용자의 로케일과 다를 수 있지만 GNU 시스템에서는 불완전하고 오래된(적어도 2015년 4월 현재) UTF-8 로케일 정의와 같습니다.