我想替换单词开头的引号。
例如:
$ 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
是单词字符,但'
不是。