PCRE grep 中的“\b”与“\S”有什么区别?

PCRE grep 中的“\b”与“\S”有什么区别?

我现在知道那\b是为了Word Boundaries

尽管

\s\S为了Shorthand Character Classes

在哪里

\s(小写)用于空白(空格、制表符、vtab、换行符)

\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不匹配任何字符。相反,它匹配每个单词开头和结尾处的零宽度单词边界。

然后我们做同样的事情\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

附带说明:请注意,它\s同时匹配空格和制表符(以及其他一些字符),就像 POSIX 字符类[[:space:]]所做的那样。如果您只想匹配空格,请使用空格字符。非空格可以与 匹配[^ ]

相关内容