此问题已在此处有答案:
[sed - explanation of the strange behavior to replace the repetition of ].*](https://stackoverflow.com/questions/77248529/sed-explanation-of-the-strange-behavior-to-replace-the-repetition-of)(2个答案)
Why does String.match( / \d*/ ) return an empty string?(4个答案)
13天前关闭
为什么一行的开头和结尾会被[.]*
匹配,如何避免?
看起来模式与单词边界匹配,但不确定它是否符合设计以及它实现的规范。
$ echo " a " | sed -n 's/[.]*/X/pg'
X XaX X
$ echo " a " | sed -n 's/[\b]*/X/pg'
X XaX X
1条答案
按热度按时间vc9ivgsu1#
请注意,括号内的
\b
没有特殊含义。它只是一个字符列表。[.]*
和[\b]*
匹配括号中的零个或多个字符。因此,它们匹配一个或多个字符的任何串,其中紧接在字符串之前和之后的空字符串只是该串的一部分。
它们还匹配任何没有紧接在字符串之前或之后的空字符串。
用更明显的东西代替空间,你的输入是:
sas
字符
.
、\
和b
都没有出现在字符串中。所以不存在长度为1或更长的游程。对于这个输入,[.]*
和[\b]*
都相当于“匹配空字符串”。s
之间的空字符串匹配s
和a
之间的空字符串匹配a
和第二个s
之间的空字符串匹配s
和行尾之间的空字符串匹配这4个匹配解释了添加到示例输出中的
X
s。使用
\b
表示单词边界并不标准,尽管一些sed
版本接受它(或相关的\<
和\>
)。不使用此扩展更安全,当然也不使用
*
。即使是支持它的
sed
版本也会产生不直观和不一致的结果。例如,使用GNU sed 4.8:
使用busybox sed 1.30.1:
甚至像Perl这样的程序也需要注意: