【问题标题】:How to substitute a character or expression for a newline using sed?如何使用 sed 将字符或表达式替换为换行符?
【发布时间】:2014-03-15 09:17:08
【问题描述】:

如何使用 Unix sed 命令将字符或表达式替换为换行符?

(对于字符替换,我通常使用tr ';' "\n" 命令。)

【问题讨论】:

    标签: bash unix sed tr


    【解决方案1】:
    1. 使用 Sed 将 ; 字符(分号)替换为换行符:

      sed "s/;/\\
      /g"
      

      sed "s/;/\\$(echo -e '\n')/g"
      
    2. 使用 Sed 将 [^A-Za-z] 表达式(除字母字符外的任何字符)替换为换行符:

      sed "s/[^A-Za-z]/\\
      /g"
      

      sed "s/[^A-Za-z]/\\$(echo -e '\n')/g"
      

    【讨论】:

    • 保持简单怎么样? sed 's/;/\n/g' <<< "a;b;c;d;e"
    • 这行不是正常结束\r\n而不是\n\r吗?它肯定在 Windows/DOS 上;当然,在 Unix 上,它只是 \n
    • @Vojtech 也许您正在像乔纳森指出的那样在 Windows 上运行。如果是这种情况,我很抱歉我无法在 windows 环境下测试它,但它在 linux 下可以正常工作。
    • @Jonathan-leffler 你是对的,这是错字。为了与 Windows 兼容,应该是 \r\n,或者只是 \n。顺便说一句,我正在运行 Linux 和 Mac OS X。 @Lynch 正确,sed 's/;/\n/g' 在 Linux Sed 4.2.1 上运行正常,但在 BSD Sed 上无法运行。
    • 在 Mac OS X 上使用bash,您可以使用ANSI-C Quotingsed $'s/;/\\\n/g' 将分号替换为换行符。双反斜杠生成一个转义以下换行符的反斜杠。您也可以将论点分成两行——但这很难在评论中显示。 (在带有 BSD sed 的 Mac OS X 10.9.1 Mavericks 上测试。)
    【解决方案2】:

    怎么样:

    sed $'s/;/\\\n/g' inputFile
    

    $ cat inputFile
    this;is;a;text
    $ sed $'s/;/\\\n/g' inputFile
    this
    is
    a
    text
    

    【讨论】:

      【解决方案3】:

      在文字换行符之前的反斜杠是在 sed 中获取换行符的可移植方式:

      $ echo "a,b" | sed 's/,/\
      /'
      a
      b
      

      【讨论】:

        【解决方案4】:

        这可能对你有用(GNU sed 和 Bash):

        sed 'y/;/\n/' file
        

        sed $'y/;/\\n/' file
        

        或者非常复杂:

        sed -e 'G' -e ':a' -e 's/\(;\)\(.*\(.\)\)/\3\2/' -e 'ta' -e 's/.$//' file
        

        【讨论】:

          猜你喜欢
          • 2021-10-25
          • 2013-02-21
          • 2021-12-18
          • 2015-11-21
          • 1970-01-01
          • 2012-12-13
          • 1970-01-01
          • 1970-01-01
          • 2013-11-03
          相关资源
          最近更新 更多