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
我做错了什么?
答案 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"