"grep -w"에 어떤 문자가 "단어"를 구성하는지 어떻게 알 수 있나요?

"grep -w"에 어떤 문자가 "단어"를 구성하는지 어떻게 알 수 있나요?
$ 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 로케일 정의와 같습니다.

관련 정보