【发布时间】:2015-02-18 16:49:11
【问题描述】:
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
我做错了什么?
【问题讨论】:
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 完成此操作,因此有一个鲜为人知的功能在这里非常有用 - 分隔符可以是任何你想要的,只要它们是不在您的替换字符串中。
所以你可以这样做
sed -i "s|$Var1|$Var2|g" test.csv
..并且可以将其替换为 $ 或 : 或您喜欢的任何其他内容。
【讨论】:
sed '/pattern/i line1' file.txt,但在修改后的版本中它不起作用:sed ':pattern:i line1' file.txt
不幸的是,& 在 sed 替换字符串中具有特殊含义,这让您感到困惑。它是一个元字符,意思是“匹配的整个模式”。为了获得文字 & 符号,您必须将其转义:
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=","} $2==v1{$2=v2} 1' test.csv
XYZ,A&B
【讨论】:
awk 声明。我看到-v 为BEGIN 块提供了一个变量,并且该块在分配后执行。然后是 FS 和 OFS(输出字段分隔符),但这部分发生了什么:$2==v1{$2=v2} 1
$2==v1 检查第二列是否等于v1 和{$2=v2} 将第二列设置为v2
1 是什么?
1 用于打印数据。
& 是一个特殊字符,因此,您需要使用 \
var2需要这样指定
Var2="A\&B"
【讨论】: