![참조](https://rvso.com/image/52094/%EC%B0%B8%EC%A1%B0.png)
의 매뉴얼 페이지에서 grep
다음을 볼 수 있습니다.
The symbols \< and \> respectively match the empty string at the beginning and
end of a word. The symbol \b matches the empty string at the edge of a word.
그러나 나는 아직도 그 차이를 알 수 없다. 나에게는 \b
단어 경계에 대한 Perl의 표기법이 있고 \<
Vim의 표기법은 같은 목적에 대한 것입니다.
추신: 영어는 제 모국어가 아닙니다. 차이점이 분명하다면 죄송합니다.
답변1
\<
단어의 시작과
\>
일치 단어의 끝과 일치 끝
\b
이나 시작에 있는 경우 두 경계 모두 일치
이러한 특수 문자의 중요한 점은 단어 경계 자체가 아니라 빈 문자열과 일치한다는 것입니다. Posix 표기법에서 (문자 a ~ Z, 숫자 및 ) \w
에 해당 하는 문자 집합과 반대되는 단어 경계입니다 .[_[:alnum:]]
_
예
마지막으로,Graeme은 매우 흥미로운 예를 발견했습니다.:
$ echo 'acegi z' | grep -o '[acegi ]*\>' | cat -A
acegi$
$ echo 'acegi z' | grep -o '[acegi ]*\b' | cat -A
acegi $
현재 이 예에서는 단어 경계 대신 단어 끝을 정확하게 일치시키는 것이 때로는 유용할 수 있음을 보여줍니다. 단어 끝을 일치시키면 공백 문자 일치의 사용이 방지되기 때문입니다.
따라서 더 유용한 예에서는 단어가 아닌 문자와 단어가 아닌 문자의 끝을 일치시키려는 경우 \>
; 그러나 아마도 \b
다음 단어의 시작과 일치하기 때문에 이 특별한 경우에 사용될 수 있습니다.
지금까지 어떤 예도 내 마음에 닿지 못했습니다. 하지만 내 생각에는 이것이 의미가 있는 몇 가지 사용 사례가 있을 수 있지만 내 생각에는 가독성 목적일 뿐이라고 생각합니다. 왜냐하면 모호 \b
하지만 단어의 시작이나 끝을 정확하게 지정하면 더 나은 이해를 제공하기 때문입니다. 그것을 읽는 사람에게 정규 표현식을 제공합니다.
답변2
제목에 대한 질문에 대답하시겠습니까?
\b
와 의 차이점은 무엇인가요\<
?
거의 없음. 둘 다 일치경계, 단어와 단어가 아닌 것 사이의 전환.
유일한인위적인차이점은 다음과 같습니다.
- 경계가 일치
\b
하는 항목둘 다단어의 시작과 끝. - 유일
\<
하게 일치하는 것은시작한마디로. - 유일
\>
하게 일치하는 것은끝한마디로.
그만큼현실적인차이점은 다음과 같습니다.
$ echo ',,abc...' | grep -o '[abc.,]*'
,,abc... # match the whole string
$ echo ',,abc...' | grep -o '[abc.,]*\b'
,,abc # to the rightmost (due to *) word boundary.
$ echo ',,abc...' | grep -o '[abc.,]*\>'
,,abc # match to the same point (in this case).
$ echo ',,abc...' | grep -o '[abc.,]*\<'
,, # match to the rightmost **start** of a word.
공백에도 동일한 작업을 수행할 수 있습니다(공백을 표시하기 위해 고양이가 추가됨).
가장 오른쪽의 "단어 경계"까지(모든)(공백에 주의):
$ echo 'abcd abcd Z' | grep -o '[a-z ]*\b' | cat -A
abcd abcd $
가장 오른쪽의 "단어 시작"(같은 지점)까지:
$ echo 'abcd abcd Z' | grep -o '[a-z ]*\<' | cat -A
abcd abcd $
가장 오른쪽의 "단어 끝"까지(후행 공백 없음):
$ echo 'abcd abcd Z' | grep -o '[a-z ]*\>' | cat -A
abcd abcd$
또는 sed를 사용하면 다음과 같습니다.
네 단어 경계:
$ echo "abc %-= def." | sed 's/\b/ |>X<| /g'
|>X<| abc |>X<| %-= |>X<| def |>X<| .
단어의 두 시작:
$ echo "abc %-= def." | sed 's/\</ |>X<| /g'
|>X<| abc %-= |>X<| def.
그리고 단어의 두 끝은 다음과 같습니다.
$ echo "abc %-= def." | sed 's/\>/ |>X<| /g'
abc |>X<| %-= def |>X<| .
참조
GNU 정보 sed에서:
'\b'
단어 경계와 일치합니다. 즉, 왼쪽 문자가 "단어" 문자이고 오른쪽 문자가 "단어가 아닌" 문자이거나 그 반대인 경우 일치합니다.
$ echo "abc %-= def." | sed 's/\b/X/g' XabcX %-= XdefX.
시작
'<' 단어의 시작 부분과 일치합니다.
$ echo "abc %-= def." | sed 's/\</X/g' Xabc %-= Xdef.
끝
'>' 단어의 끝과 일치합니다.
$ echo "abc %-= def." | sed 's/\>/X/g' abcX %-= defX.