为什么行的开头和结尾是匹配的[.]*
以及如何避免它?
看起来模式与单词边界匹配,但不确定它是否按照设计以及它实现了哪个规范。
$ echo " a " | sed -n 's/[.]*/X/pg'
X XaX X
$ echo " a " | sed -n 's/[\b]*/X/pg'
X XaX X
为什么行的开头和结尾是匹配的[.]*
以及如何避免它?
看起来模式与单词边界匹配,但不确定它是否按照设计以及它实现了哪个规范。
$ echo " a " | sed -n 's/[.]*/X/pg'
X XaX X
$ echo " a " | sed -n 's/[\b]*/X/pg'
X XaX X
请注意,
\b
括号内没有特殊含义。它只是一个字符列表。[.]*
并[\b]*
匹配括号中的零个或多个字符。因此,它们匹配一个或多个字符的任何运行,其中紧邻字符运行之前和之后的空字符串只是该运行的一部分。
它们还匹配任何前面或后面不是连续字符的空字符串。
用更明显的东西替换空间,您的输入是:
sas
字符串中没有出现
.
任何字符\
, 。b
因此不存在长度为 1 或更长的游程。通过此输入, 和 都[.]*
相当于[\b]*
“匹配空字符串”。s
匹配之间的空字符串s
first和a
matches之间的空字符串a
和第二个s
匹配之间的空字符串s
第二行和行尾之间的空字符串匹配这 4 个匹配解释了
X
添加到示例输出中的 s。用于
\b
表示单词边界并不标准,尽管某些版本sed
接受它(或相关的\<
and\>
)。不使用此扩展更安全,当然也不使用
*
.即使它的版本
sed
似乎支持它,也会产生不直观且不一致的结果。例如,对于 GNU sed 4.8:
对于 busybox sed 1.30.1:
甚至像 Perl 这样的其他程序也需要小心: