sed命令替换具有特殊字符“&”的字符串

Sed command to replace a string which has a special character "&"

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

我做错了什么?

不幸的是,您被 & 在 sed 替换字符串中具有特殊含义这一事实所困扰。它是一个元字符,表示 "the entire pattern that was matched"。为了获得文字符号,您必须将其转义:

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

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

如果您不想处理正则表达式和转义,请像这样使用 awk

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

& 是一个特殊的字符,因此,您需要使用 \ 需要这样指定var2

Var2="A\&B"

由于问题询问如何使用 SED 完成此操作,因此有一个鲜为人知的功能在这里非常有用 - 定界符可以是您想要的任何东西只要它们不在您的替换字符串中。

所以对于以上你可以做

sed -i "s|$Var1|$Var2|g" test.csv

..并且可以用 $ 或 : 或您喜欢的任何其他内容替换它。