【问题标题】:How can I insert double quotes (") between two columns using sed/awk/perl如何使用 sed/awk/perl 在两列之间插入双引号 (")
【发布时间】:2013-02-22 10:14:52
【问题描述】:

我有一个包含内容的文件:

Version:2.0

我需要以下格式的输出:

"Version":"2.0"

我应该如何在这些列中插入双引号?

【问题讨论】:

    标签: perl sed awk


    【解决方案1】:

    简单的单行:

    perl -plwe 's/([^:]+)/"$1"/g'
    

    取任何不是冒号的内容并在其周围加上引号。由于-l 选项,我们避免了这种情况,包括末尾的换行符。

    【讨论】:

    • 这实际上只从所有列中打印:。不要将Version:2.0 放在双引号中。
    • @AshutoshNarayan 我不知道该告诉你什么,除了:不,它不仅从所有列中打印一个冒号,而且它确实将它放在双引号中。正则表达式删除任何内容的唯一方法是如果匹配,如果匹配,它也会捕获和替换。如果它对您不起作用,那是因为您以某种方式更改了它,或者尽管所有内容都插入了 $1,但您的外壳仍然存在 - 但即便如此,引号仍然会被插入。所以,不,你所说的发生在这段代码中是不可能发生的。
    • 是的,它确实插入了双引号。我想我会错过一些东西。可以接受。
    • @TLP:提供一个“可接受”的解决方案不是很好吗!
    【解决方案2】:
    sed -r 's/(^|$)/"/g;s/:/":"/' file
    
    kent$  echo "Version:2.0"|sed -r 's/(^|$)/"/g;s/:/":"/'  
    "Version":"2.0"
    

    【讨论】:

      【解决方案3】:
      awk -F":" -v OFS=":" '{for(i=1;i<=NF;i++){$i="\""$i"\"";}print}' 
      

      测试:

      > echo "Version:2.0" | awk -F":" -v OFS=":" '{for(i=1;i<=NF;i++){$i="\""$i"\"";}print}'
      "Version":"2.0"
      

      perl -F -lane 'for(@F){$_="\"".$_."\"";}print join ":",@F'
      

      【讨论】:

        【解决方案4】:
         perl -lpe'$_ = join ":",map qq{"$_"},split /:/' myfile
        

        【讨论】:

        • @Borodin。我喜欢你的解决方案。
        • @sarathi:谢谢。不像其他一些简短(我最喜欢的是 TLP),但 IMO 它描述了它的作用。
        【解决方案5】:

        这是另一个sed 替代方案:

        echo Version:2.0 | sed 's/[^:]*/"&"/g'
        

        输出:

        "Version":"2.0"
        

        【讨论】:

          【解决方案6】:

          我认为awksn-p 可能会有所帮助:

          gawk -F: '{gsub("\"", "\"\""); \
            for(i=1;i<NF;i++) printf("\"%s\":",$i); \
            printf("\"%s\"\n",$NF); }' testfile
          

          它做了额外的工作并将现有的引号加倍。

          为了创建测试文件,我使用了以下代码:

          cat << EODATA > testfile
          Version:2.0
          Some:field:with:double(")quotes
          EODATA
          

          【讨论】:

            【解决方案7】:

            在 perl 中,你可以这样做:

            perl -pe "s/([^:]+):(.+)/\"\1\":\"\2\"/" YourTextFile.txt
            

            编辑 1: 在 Linux 中,使用 $1$2 而不是 \1\2 会导致应该引用的字符串为空 - 输出为 '" “:”“'。我认为这是因为美元 $ 在某些 *nix shell 中是一个特殊字符。逃离美元也很有效:

            perl -pe "s/([^:]+):(.+)/\"\$1\":\"\$2\"/" YourTextFile.txt
            

            编辑 2: 正如@TLP 建议的那样,使用单引号是 *nix 的最佳选择,因为它避免了 shell 插值并且还允许删除所有转义。

            perl -pe 's/([^:]+):(.+)/"$1":"$2"/' YourTextFile.txt
            

            【讨论】:

            • 它将输出输出为"":"" 而不是"Version":"2.0"
            • 这很奇怪!在带有 Perl 5.16 的 Windows 上它可以工作,但在带有 Perl 5.10 的 Linux 上它的行为与您描述的一样。无论如何,解决方法是使用反斜杠代替美元作为反向引用 - 编辑答案...
            • 在linux中使用单引号避免shell插值。
            猜你喜欢
            • 1970-01-01
            • 2014-09-07
            • 1970-01-01
            • 2011-03-28
            • 2014-06-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-06-01
            相关资源
            最近更新 更多