我正在尝试将下面字符串中的变量'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发行版。
答案 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”替换任何非单词。