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

Mic*_*ant 15 sed

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

例如:

$ 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
Run Code Online (Sandbox Code Playgroud)

但是正如您所看到的,它们在单词的末尾而不是开头被替换。
如何替换以单词开头的那些?

Joh*_*024 15

'在单词开头替换:

$ 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
Run Code Online (Sandbox Code Playgroud)

对于人类而不是计算机,这里有一个特殊性:计算机将其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
Run Code Online (Sandbox Code Playgroud)

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

  • @stephanmg 单词边界不是空格。它是单词字符(例如:字母数字)和非单词字符(例如:空格或标点符号)__之间的边界(或位置)。 (2认同)
  • 啊,好的,谢谢约翰!那讲得通。 (2认同)