sed - 如何正确使用 \b 字边界?

sed - 如何正确使用 \b 字边界?

我想替换单词开头的引号。

例如:

$ echo "a 'line' a single ' after a  'keyword' with a few space's for a program"\
| sed "s/\b'/X/g"
a 'lineX a single ' after a  'keywordX with a few spaceXs for a program

但正如你所看到的,它们正在被替换结尾言语不是开始。
如何替换单词开头的单词?

答案1

这会替换'单词开头:

$ echo "a 'line' a single ' after a  'keyword' with a few space's for a program"| sed "s/'\b/X/g"
a Xline' a single ' after a  Xkeyword' with a few spaceXs for a program

对于人类(而不是计算机)来说,这里有一个特点:计算机将其space's视为两个单词并替换了 the,'因为它位于第二个单词的开头。

讨论

\b标记单词边界,无论是开始还是结束。现在考虑一下\b'。这与后跟的单词边界匹配'。既然'不是单词字符,这意味着单词结尾必须在 之前才能'匹配。要用于\b匹配单词的开头,请颠倒顺序:'\b。同样,由于'不是单词字符,因此仅当 后面有单词时才会匹配'

一些 sed,例如 GNU sed,支持\<匹配单词的开头。这对您的情况没有帮助,因为'它已经不是单词字符,这会导致问题出现。

关于“空间”该怎么办

如果您不希望'替换 inspace's因为'出现在单词的末尾,您可以使用以下方法反转逻辑\B

$ echo "a 'line' a single ' after a  'keyword' with a few space's for a program"| sed "s/\B'/X/g"
a Xline' a single X after a  Xkeyword' with a few space's for a program

\B匹配于不是单词边界。因此\B'匹配'(space-quote) 因为空格和引号都不是单词字符。它与 at 不匹配,space'因为e'is 是单词边界:e是单词字符,但'不是。

相关内容