【问题标题】:Replace Double quote with double double quote with awk用 awk 替换双引号
【发布时间】:2017-04-09 23:09:44
【问题描述】:

我正在用 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##

【问题讨论】:

  • 您的输入文件是什么样的? $f3 内容?
  • 您好,感谢您的回复 01##"hello world"98##
  • 如果你对sedsed 's/"/&amp;&amp;/g' inputfile没问题

标签: linux bash awk substring gsub


【解决方案1】:

要将所有双引号替换为两个双引号,请使用 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

【讨论】:

    【解决方案2】:

    只是失去循环等:

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

    阅读 Arnold Robbins 所著的《Effective Awk Programming, 4th Edition》一书。

    【讨论】:

      【解决方案3】:

      将循环改为

      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
      

      【讨论】:

      • @EdMorton:对...在 OP 的代码中,它从 0 开始。所以,它替换了我提到的两次...
      猜你喜欢
      • 1970-01-01
      • 2015-07-31
      • 1970-01-01
      • 2018-09-23
      • 2015-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-12
      相关资源
      最近更新 更多