我对sed完全不熟悉,并且作为脚本编写的一部分,我正在尝试替换现场的特定字符串。我知道需要使用反斜杠转义特殊字符,但问题是如果特殊字符在行中的第一个,那么它就不会被替换....
例如,我的文件包含
sldgfkls $bdxcv sldflksd
现在,如果我写下面的代码
sed -i 's/\b\$bdxcv\b/abcd/' filename
然后上面的单词不会被替换....但是如果文件包含
sldgfkls a$bdxcv sldflksd
现在,如果我写下面的代码
sed -i 's/\ba\$bdxcv\b/abcd/' filename
然后上面的单词被替换..... 请帮帮我......
答案 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
以上使用字符串比较和字符串赋值 - 除非其中一个字符串包含字符串分隔符"
,否则无需转义任何内容。