使用正则表达式\ W使用sed匹配非单词的问题

时间:2014-02-16 22:29:45

标签: regex bash sed

我正在尝试将下面字符串中的变量'a'替换为'apple'。我试图在sed中使用正则表达式,但我得到了奇怪的结果

=e+a:0==a[q]("/")?a=k+a:a&&0!=a[q]("?")?0>a[y]("/")[0][q]

foo.txt包含上面的字符串。

我认为这可能有效,但没有匹配回报:

sed 's/\W(a)/apple/g' foo.txt

当我尝试这个时

sed 's/\W/apple/g' foo.txt

我得到了这个输出

appleeappleaapple0appleappleaappleqappleappleappleappleappleappleappleaapplekappleaappleaappleapple0appleappleaappleqappleappleappleappleappleappleapple0appleaappleyappleappleappleappleappleappleapple0appleappleqapple

为什么\ W应该匹配非单词字符不能正常工作?我正在运行Ubuntu 12.10发行版。

2 个答案:

答案 0 :(得分:3)

\W似乎与您的表达无关。为什么不将a替换为apple

$ echo '=e+a:0==a[q]("/")?a=k+a:a&&0!=a[q]("?")?0>a[y]("/")[0][q]' | sed -e 's/a/apple/g'
=e+apple:0==apple[q]("/")?apple=k+apple:apple&&0!=apple[q]("?")?0>apple[y]("/")[0][q]

您可能(正确地)担心这会将car等字词替换为cappler。在这种情况下,您可以执行此操作(在Mac和其他BSD系统上):

$ echo 'a abc la car a' | sed -E -e 's/[[:<:]]a[[:>:]]/apple/g'
apple abc la car apple

如果你有GNU sed,它就像:

一样简单
$ echo 'a abc la car a' | sed -E -e 's/\ba\b/apple/g'
apple abc la car apple

答案 1 :(得分:1)

我认为你想要的是

sed 's/a\W/apple/g' foo.txt

这样你只选择字母“a”后跟非字符,如果这样你可以识别你的“a”变量。

“\ W”实际上是正确匹配的,因为它用整个单词“apple”替换任何非单词。