2016-11-25 275 views
0

我正在用awk编写脚本来替换所有双引号对于文件夹中所有文件的双引号。用awk替换双引号和双引号

我看到这个计算器,但我得到其他结果

awk 'BEGIN{FS=OFS="#"} {for (i=0;i<=NF;i++) gsub(/"/, "&&",$i)} 1 $f3 > $f2 

输出这个例子比如:

01##"hello world"98## 

01##""""hello world""""98## 

而且我想获得

01##""hello world""98## 
+0

你的输入文件是怎么样的? '$ f3'内容? – Inian

+0

嗨,谢谢你的回复 01 ##“hello world”98 ## –

+1

如果你用'sed'' sed's /“/ &&/g'inputfile'好 –

回答

5

要更换有两个双引号的所有双引号,使用SED:

sed 's/"/""/g' file 

没有必要比这更有趣。

要做到这一点对目录中的所有文件,请使用就地选择,如果您的sed的版本支持:

sed -i.bak 's/"/""/g' * 

这与后缀.bak创建每个文件的备份。

如果您不能使用-i,然后使用循环使用临时文件:

for i in *; do 
    sed 's/"/""/g' "$i" > tmp && mv tmp "$i" 
done 

或者总是有好老ed

for i in *; do 
    ed -s "$i" <<< $',s/"/""/g\nw' 
done 
0

环路更改为

awk 'BEGIN{FS=OFS="#"} {for (i=1;i<=NF;i++) gsub(/"/, "&&",$i)} 1' $f3 > $f2 

当环路以0开始时,它首先与""替换"$0(在此上下文中整行),然后再次对每个字段。

但实际上,你可以只是使它紧凑:

awk '{gsub(/"/,"\"\"");}1' $f3 > $f2 

或者

sed 's/"/""/g' $f3 > $f2 
+0

@EdMorton: Right ... In OP的代码,它从0开始。因此,它被两次替代,正如我所提到的那样... – anishsane

2

就失去了环路等:

$ echo '01##"hello world"98##' | awk '{gsub(/"/,"&&")}1' 
01##""hello world""98## 

阅读Arnold Ro编写的Effective Awk Programming第4版bbins。