그렙 단어 경계


22

GNU 문서에 따르면 :

‘\<’ Match the empty string at the beginning of word.
‘\>’ Match the empty string at the end of word.

내 / etc / fstab은 다음과 같습니다.

/dev/sdb1       /media/fresh      ext2   defaults     0 0

grep이 / media / fresh의 존재에 대해 TRUE / FALSE를 반환하기를 원합니다. 내가 사용하려고 \<하고 \>있지만 작동하지 않았다. 왜?

egrep '\</media/fresh\>' /etc/fstab

해결 방법 :

egrep '[[:blank:]]/media/fresh[[:blank:]]' /etc/fstab

그러나 더 추한 것 같습니다.

내 grep은 2.5.1입니다


4
필자 /는 단어 문자로 간주되지 않으므로 정규식이 일치하지 않는다고 가정합니다. "\ b 영숫자 시퀀스 전후에 일치"는 "단어 전후"를 말하는 것보다 정확합니다.
Felipe Alvarez

답변:


27

\<\>(가) 시작하고 각 단어의 끝에 만 단어 구성 문자는에 빈 문자열을 일치 :

[[:alnum:]_]

보낸 사람 man grep:

Word-constituent characters are letters, digits, and the underscore.

따라서 /유효한 단어 구성 문자가 아니기 때문에 정규 표현식이 실패 합니다.

대신 공백이 있으면 -w옵션을 사용 grep하여 단어를 일치 시킬 수 있습니다 .

grep -wo '/media/fresh' /etc/fstab

예:

$ grep -wo '/media/fresh' <<< '/dev/sdb1       /media/fresh      ext2   defaults     0 0'
/media/fresh

질문을 게시 한 후의 수치입니다. 내가 달성하고자하는 것에 대한 제안이 있습니까?
Felipe Alvarez

@FelipeAlvarez 내 편집 내용 확인 ..
heemayl

1

이 문제를 \<(그리고는 \b)에뿐만 아니라 적용 /하지만, 모든 비 단어 문자에. (예 : [[:alnum:]]및 이외의 문자 _)

문제는 정규식 엔진이 /다음 앵커를 검색 할 때 와 같이 항상 단어가 아닌 문자를 무시한다는 것 \<입니다. 그래서 /바로 다음 과 같이 단어가 아닌 문자를 넣지 말아야합니다 \<. 당신이 할 경우, 건설에 의해 아무것도 일치하지 않습니다.

-wgrep 옵션 의 대안 은 다음과 같습니다.

egrep "(^|\W)/media/fresh($|\W)"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.