【问题标题】:Bash: Replacing "" with newline character, using sed or trBash:用换行符替换“”,使用 sed 或 tr
【发布时间】:2017-04-27 10:56:49
【问题描述】:

我正在尝试以在每个“行”之后插入换行符的方式格式化输出,其中行用双引号 ("") 表示。引号本身是临时的,将在后面的步骤中删除。

输入:

"a",1,"aa""b",2,"bb"

输出:

a,1,aa
b,2,bb

我试过了:

sed 's/""/\n/'
sed 's/""/\/g'
tr '""' '\n'

但是 tr 似乎替换了每个引号字符,而 sed 似乎将 \n 作为文本插入而不是换行符。我可以做些什么来完成这项工作?

【问题讨论】:

    标签: bash sed tr


    【解决方案1】:
    echo '"a",1,"aa""b",2,"bb"' |awk -v RS='""' '{$1=$1} {gsub(/"/,"")}1'
    a,1,aa
    b,2,bb
    

    或使用sed:

     echo '"a",1,"aa""b",2,"bb"' |sed -e 's/""/\n/' -e 's/"//g'   # OR sed -e 's/""/\n/;s/"//g'
    a,1,aa
    b,2,bb
    

    awk 解决方法:这里默认记录分隔符由换行改为""。所以awk 会在遇到"" 时考虑 EOL。

    sed 解决方案:这里首先将"" 转换为新行,第二个替换是从每一行中删除"

    【讨论】:

      【解决方案2】:
      neech@nicolaw.uk:~ $ cat file.txt
      "a",1,"aa""b",2,"bb"
      neech@nicolaw.uk:~ $ sed 's/""/\n/' file.txt | tr -d '"'
      a,1,aa
      b,2,bb
      

      【讨论】:

      • tr 在这里是不必要的。你可以像echo '"a",1,"aa""b",2,"bb"'| sed 's/""/\n/g;s/"//g' 一样单独使用sed 完成
      • 确实如此。只是在调整 OP 的原始尝试。 :-)
      【解决方案3】:

      您似乎正在处理 POSIX sed,它不支持 \n 表示法。在模式中插入一个实际的换行符:

      sed 's/""/\
      /'
      

      或者:

      sed 's/""/\'$'\n''/'
      

      例如:

      sed 's/""/\
      /' | tr -d \"
      

      输出:

      a,1,aa
      b,2,bb
      

      【讨论】:

        【解决方案4】:

        George Vasiliou 建议,如果你有 perl,你可以使用:

        >  echo '"a",1,"aa""b",2,"bb"' | perl -pe 's/""/"\n"/g;s/"//g'
        

        这避免了不可移植的 sed 问题。

        或者对于一个糟糕的黑客版本。

        将 "" 替换为另一个字符,然后使用 tr(因为 tr 应该与 \n 一起使用)将其替换为 \n,然后删除后面的单个 "。

        因此,您可以像这样将“”替换为换行符:

        sed 's/""/#/g' | tr '#' '\n'
        

        接下来是:

        > echo '"a",1,"aa""b",2,"bb"'| sed 's/""/#/g' | tr '#' '\n' | sed 's/\"//g'
        

        【讨论】:

        • 回显 '"a",1,"aa""b",2,"bb"'| sed 's/\"\"/\n/g' | sed 's/\"//g' 仍然只为我输出 1 行
        • 这很奇怪,它对我有用。我再看看。
        • 看 thor 的帖子,我想他可能正在做点什么
        • sed 无法按预期工作时(即您使用 GNU sed 而 OP 可能使用非 gnu sed),有一个可移植的解决方案可以避免 sed 的困惑:用 perl -pe 替换 sed保持所有其余代码与 sed 命令中使用的相同。使用perl -pe 将在任何安装了 perl 的平台上以相同的方式工作。
        猜你喜欢
        • 2015-11-21
        • 2021-10-25
        • 2013-05-25
        • 1970-01-01
        • 2019-03-03
        • 2019-08-07
        • 1970-01-01
        • 2023-01-13
        • 2014-11-07
        相关资源
        最近更新 更多