我现在知道那\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:~$
答案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:]]
所做的那样。如果您只想匹配空格,请使用空格字符。非空格可以与 匹配[^ ]
。