【问题标题】:How to add double quotes to a line with SED or AWK?如何在 SED 或 AWK 的行中添加双引号?
【发布时间】:2012-06-01 01:14:46
【问题描述】:

我有以下单词列表:

name,id,3

我需要像这样双引号:

"name,id,3"

我试过sed 's/.*/\"&\"/g',得到了:

"name,id,3

只有一个双引号,缺少结束双引号。

我也试过awk {print "\""$1"\""},结果完全相同。我需要帮助。

【问题讨论】:

  • 你的 sed 命令在我的电脑上运行。您可以省略双引号之前的反斜杠,因为它们在单引号字符串中无用。
  • 嗯,是的,这很奇怪。我得到一个双引号。我的原始文件是 file.csv——有一长串“name,id,[[:num:]]”。为什么它不起作用?
  • g 不是必需的,但它不会导致您的问题。你的平台是什么?

标签: regex shell awk sed text-processing


【解决方案1】:

这对我有用:

echo name,id,3 | sed 's/name,id,3/"name,id,3"/'
"name,id,3"

【讨论】:

    【解决方案2】:

    在使用 sed 命令之前,您可以使用 \ 作为转义字符,然后它将在您的字符串中打印 "。例如,我使用以下命令将类似的字符串放在文本文件的第一行:

    var = "\"name,id,3\""
    sed -i '1i' "$var" /tmp/out.txt
    

    【讨论】:

      【解决方案3】:

      类似于@Dennis 解决方案,

      使用

      sed 's/\(.*\)/"\1"/g'
      

      无需查找'\r',这将对所有字符串应用双引号。 这不需要在输入文件上运行 dos2unix。

      【讨论】:

        【解决方案4】:

        我发现的最简单的方法是使用 HEX 代码作为双引号:

         echo name,id,3 | awk '{print "\x22" $1 "\x22"}'
         "name,id,3"
        

        【讨论】:

          【解决方案5】:

          使用它来将您的输入输入:

          sed 's/^/"/;s/$/"/'
          

          ^ 是行开始的锚点,$ 是行尾的锚点。对于sed 行,我们将分别用"" 替换行开始和行结束。

          例子:

          $ echo -e "name,id,2\nname,id,3\nname,id,4"|sed 's/^/"/;s/$/"/'
          "name,id,2"
          "name,id,3"
          "name,id,4"
          

          没有sed:

          $ echo -e "name,id,2\nname,id,3\nname,id,4"
          name,id,2
          name,id,3
          name,id,4
          

          您的文件似乎有 DOS 行结尾。将其通过dos2unix first

          证明:

          $ cat test.txt
          name,id,2
          name,id,3
          name,id,4
          $ sed 's/^/"/;s/$/"/' test.txt
          "name,id,2
          "name,id,3
          "name,id,4
          $ cat test.txt|dos2unix|sed 's/^/"/;s/$/"/'
          "name,id,2"
          "name,id,3"
          "name,id,4"
          

          【讨论】:

            【解决方案6】:

            您可以像这样使用 awk 而不是 sed:

            line='name,id,3'
            echo $line | awk '{printf("\"%s\"\n", $0);}'
            

            或者更好的是像这样使用 BASH printf:

            printf '"%s"\n' $line
            

            【讨论】:

            • 我有这样的命令,但我需要将每个输出行包含在“”中。如何修改这个命令? :awk '{ for (i = 2; i result.txt
            • 引用每一行只需使用:awk '{printf("\"%s\"\n", $0)}' file
            【解决方案7】:

            您的输入文件在行尾有回车符。您需要在文件上使用dos2unix 来删除它们。或者你可以这样做:

            sed 's/\(.*\)\r/"\1"/g'
            

            这将删除回车并添加引号。

            【讨论】:

            • 成功了!没错,文件来自windows,是在windows中生成的
            • 很好的解决方案!你能解释一下 \r 和 "\1" 在这里做什么吗?
            • @satch_boogie: \r 是回车。 \1 是由括号完成的捕获的内容(因此在这种情况下,是回车之前的整行)。结果是删除了回车并添加了引号。我认为最后的g (global) 是不必要的,但我的回答保留了 OP 的问题。有关捕获组的更多信息,请参阅this
            猜你喜欢
            • 1970-01-01
            • 2021-09-24
            • 2021-10-25
            • 1970-01-01
            • 1970-01-01
            • 2022-01-04
            • 2021-09-28
            • 2015-07-31
            • 1970-01-01
            相关资源
            最近更新 更多