Sed命令替换具有特殊字符的字符串"&"

时间:2015-02-18 16:49:11

标签: bash shell

test.csv的内容是:

XYZ,IN123

这是我的剧本:

Var1=IN123
Var2=A&B
sed -i "s/$Var1/$Var2/g" test.csv

这是我替换test.csv内容的简单代码,当代码找到IN123时,它将被A& B替换。

所以期望的输出是:

XYZ,A&B

但是上面的代码我得到了:

XYZ,AIN123B

我做错了什么?

3 个答案:

答案 0 :(得分:4)

不幸的是,&在sed替换字符串中具有特殊含义这一事实让您感到困惑。它是一个元字符,意思是“匹配的整个模式”。为了获得文字&符号,你必须逃避它:

Var1='IN123'
Var2='A\&B'
sed -i "s/$Var1/$Var2/g" test.csv

单引号是防止\&被解释为赋值中的转义序列所必需的。我将它们添加到两个变量中以实现对称。

答案 1 :(得分:2)

如果您不想处理正则表达式并逃避使用awk,请执行以下操作:

Var1='IN123'
Var2='A&B'
awk -v v1="$Var1" -v v2="$Var2" 'BEGIN{FS=OFS=","} $2==v1{$2=v2} 1' test.csv
XYZ,A&B

答案 2 :(得分:1)

&安培;是一个特殊的字符,因此,您需要使用\ 需要以这种方式指定Var2

Var2="A\&B"