用 awk 将双引号替换为双引号
Replace Double quote with double double quote with awk
我正在用 awk 编写一个脚本,以将文件夹中所有文件的所有双引号替换为双引号。
我在 Whosebug 中找到了这个,但我得到了其他结果
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##
将循环更改为
awk 'BEGIN{FS=OFS="#"} {for (i=1;i<=NF;i++) gsub(/"/, "&&",$i)} 1' $f3 > $f2
当循环从 0 开始时,它首先将 "
替换为 ""
用于 [=15=]
(在此上下文中为整行),然后再次用于每个字段。
但实际上,您可以通过以下方式使其紧凑:
awk '{gsub(/"/,"\"\"");}1' $f3 > $f2
或
sed 's/"/""/g' $f3 > $f2
要用两个双引号替换所有双引号,使用 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
只是失去循环等:
$ echo '01##"hello world"98##' | awk '{gsub(/"/,"&&")}1'
01##""hello world""98##
阅读 Arnold Robbins 着的 Effective Awk Programming,第 4 版。
我正在用 awk 编写一个脚本,以将文件夹中所有文件的所有双引号替换为双引号。
我在 Whosebug 中找到了这个,但我得到了其他结果
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##
将循环更改为
awk 'BEGIN{FS=OFS="#"} {for (i=1;i<=NF;i++) gsub(/"/, "&&",$i)} 1' $f3 > $f2
当循环从 0 开始时,它首先将 "
替换为 ""
用于 [=15=]
(在此上下文中为整行),然后再次用于每个字段。
但实际上,您可以通过以下方式使其紧凑:
awk '{gsub(/"/,"\"\"");}1' $f3 > $f2
或
sed 's/"/""/g' $f3 > $f2
要用两个双引号替换所有双引号,使用 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
只是失去循环等:
$ echo '01##"hello world"98##' | awk '{gsub(/"/,"&&")}1'
01##""hello world""98##
阅读 Arnold Robbins 着的 Effective Awk Programming,第 4 版。