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
..并且可以用 $ 或 : 或您喜欢的任何其他内容替换它。
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
..并且可以用 $ 或 : 或您喜欢的任何其他内容替换它。