fedora sed命令替换特殊字符

时间:2015-02-16 13:15:46

标签: linux bash sed

我对sed完全不熟悉,并且作为脚本编写的一部分,我正在尝试替换现场的特定字符串。我知道需要使用反斜杠转义特殊字符,但问题是如果特殊字符在行中的第一个,那么它就不会被替换....

例如,我的文件包含

sldgfkls $bdxcv sldflksd

现在,如果我写下面的代码

sed -i 's/\b\$bdxcv\b/abcd/' filename

然后上面的单词不会被替换....但是如果文件包含

sldgfkls a$bdxcv sldflksd

现在,如果我写下面的代码

sed -i 's/\ba\$bdxcv\b/abcd/' filename

然后上面的单词被替换..... 请帮帮我......

2 个答案:

答案 0 :(得分:0)

显然,\b并不认为美元符号是单词字符,因此没有字边界可以在空格和$之间进行匹配。

也许你想要这个:

sed -i 's/\(^\|[\t ]\)\$bdxcv\b/\1abcd/' filename

假设您的是GNU sed,请参阅包含此定义的https://www.gnu.org/software/sed/manual/sed.html

  

“单词”字符是任何字母或数字或下划线字符。

因此不是美元符号。

答案 1 :(得分:0)

sed不能操作字符串,只能是正则表达式。试图弄清楚哪些字符需要被转义以禁用它们的正则表达式(或sed分隔符或sed反向引用)意味着在sed中制作正则表达式就好像它是一个字符串是一个傻瓜的差事,只需使用一个可以对字符串进行操作的工具,例如AWK。

$ awk '{for (i=1;i<NF;i++) if ($i == "$bdxcv") $i="abcd"} 1' file
sldgfkls abcd sldflks

以上使用字符串比较和字符串赋值 - 除非其中一个字符串包含字符串分隔符",否则无需转义任何内容。