用awk替换双引号双引号

时间:2016-11-25 14:09:23

标签: linux bash awk substring gsub

我正在用awk编写一个脚本,用文件夹中所有文件的双倍双引号替换所有双引号。

我在stackoverflow中发现了这个,但我得到了其他结果

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##

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

失去循环等:

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

阅读Arnold Robbins撰写的有效Awk编程,第4版。

答案 2 :(得分:0)

将循环更改为

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

当循环从0开始时,它首先将"替换为"" $0(在此上下文中为整行),然后再替换为per-field。

但实际上,您可以通过以下方式使其紧凑:

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

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