PCRE grep에서 "\b"와 "\S"의 차이점은 무엇입니까?

PCRE grep에서 "\b"와 "\S"의 차이점은 무엇입니까?

이제 알아요 그게 \b바로Word Boundaries

하지만

\s이다\SShorthand Character Classes

어디

\s(소문자) 공백(공백, 탭, vtabs, 줄 바꿈)

그리고

\S(대문자)는 그 반대이다. 공백 이외의 것

wolf@linux:~$ cat space.txt 
0space
1 spaces
2  spaces
3   spaces
4    spaces
wolf@linux:~$ 

이 두 명령 사이에는 아무런 차이가 없습니다.

wolf@linux:~$ grep -P '\S\s\S' space.txt 
1 spaces
wolf@linux:~$ grep -P '\S\s\S\S' space.txt 
1 spaces
wolf@linux:~$ 

그리고

wolf@linux:~$ grep -P '\b\s\b' space.txt
1 spaces
wolf@linux:~$ grep -P '\b\s\b\b' space.txt
1 spaces
wolf@linux:~$ 

인용하다:https://staff.washington.edu/weller/grep.html

답변1

GNU를 사용한 예 sed:

\b문자열의 각 항목을 괄호로 묶습니다 Hello world!.

$ sed 's/\b/(&)/g' <<<'Hello world!'
()Hello() ()world()!

보시다시피 \b일치하는 문자가 없습니다. 대신 각 단어의 시작과 끝에서 너비가 0인 단어 경계를 일치시킵니다.

그런 다음 동일한 작업을 수행합니다 \S.

$ sed 's/\S/(&)/g' <<<'Hello world!'
(H)(e)(l)(l)(o) (w)(o)(r)(l)(d)(!)

\S공백이 아닌 모든 문자 와 일치합니다 .

특정 개수의 공백을 일치시키려는 경우 사용합니다 \S\s{3}\S. 이렇게 하면 세 개의 공백과 일치하지만 해당 공백을 공백이 아닌 문자로 양쪽에 묶어야 합니다. 줄의 시작이나 끝 부분에 공백이 나타나면 이 표현식의 일치가 실패합니다.

를 사용하는 경우 \b\s{3}\b단어 경계로 둘러싸인 세 개의 공백이 필요합니다. 이것회의이는 줄의 시작이나 끝 부분에 공백이 나타날 수 있는 경우에도 일치합니다. 그러나 공백이 단어가 아닌 다른 문자(예: 문자열)로 둘러싸여 있으면 실패합니다 hello;   ;world.

참고로 \sPOSIX 문자 클래스와 마찬가지로 공백과 탭(및 기타 몇 가지 문자) 모두와 일치합니다 [[:space:]]. 공백만 일치시키려면 공백 문자를 사용하십시오. 공백이 아닌 문자도 일치시킬 수 있습니다 [^ ].

관련 정보