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입니다.
답변1
\<
\>
단어의 시작과 끝에서 각각 빈 문자열과 일치하며, 단어 구성 문자는 다음과 같습니다 .
[[: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
답변2
\<
(and)에 대한 이 질문은 \b
에만 적용되는 것이 아니라 /
단어가 아닌 모든 문자에도 적용됩니다. (즉, [[:alnum:]]
및 이외의 문자 입니다 _
.)
문제는 정규식 엔진이 /
다음 앵커를 검색할 때 처럼 항상 단어가 아닌 문자를 우회한다는 것입니다 \<
. 그렇기 때문에 /
그 뒤에 단어가 아닌 문자를 넣으면 안 됩니다 \<
. 이렇게 하면 구성상 아무것도 일치하지 않습니다.
grep 옵션의 대안 -w
은 다음과 같습니다.
egrep "(^|\W)/media/fresh($|\W)"