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
..并且你可以用 $ 或 : 或任何你喜欢的其他字符代替它。
Var1='IN123'
Var2='A\&B'
sed -i "s/$Var1/$Var2/g" test.csv
\&
被解释为转义序列。我为了对称性在两个变量中都加了它们。sed: 1: "test.csv": undefined label 'est.csv'
。 - Boris-i
开关的行为所致。https://dev59.com/IGct5IYBdhLWcg3wL6ui#69955786 尝试使用sed -i''
或传递一个非空字符串以创建具有该后缀的备份文件。 - Tom Fenechsed -i''
工作了! - Boris如果你不想处理正则表达式和转义,可以使用以下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
是什么意思? - harperville$2==v1
checks if 2nd column equals to v1
and {$2=v2}
sets 2nd column to v2
- anubhava1
是什么意思? - harperville1
是用于打印数据。 - anubhava&是一个特殊字符,因此您需要使用\
。需要以这种方式指定Var2。
Var2="A\&B"
sed '/pattern/i line1' file.txt
但在修改后的版本中,它将无法工作:sed ':pattern:i line1' file.txt
- kamil_debski