如何使用sed替换换行符(\ n)?


记忆短浅♡思念不变
2025-03-28 09:47:54 (11天前)


如何使用sed替换换行符(\ n)

命令
</跨度>

我没试成功:

sed的#\ n ## g’文件
sed的#^ $ ## g’文件

我如何解决它?
锟斤拷

20 条回复
  1. 0# Little it | 2019-08-31 10-32




    1. sed 1h;1!H;$!d
      x;s/\n/ /g YourFile

    2. </code>


    这不适用于大型文件(缓冲区限制),但如果有足够的内存来保存文件,则效率非常高。
    (更正

    H

    1. - GT;
    2. <code>
    3. 1h;1!H
    4. </code>
    5. @hilojack的好评之后)



    另一个版本在读取时更改新行(更多cpu,更少内存)




    1. sed ‘:loop
      $! N
      s/\n/ /
      t loop YourFile

    2. </code>

  2. 1# 喜欢一个人 | 2019-08-31 10-32



    在某些情况下,你可以改变

    RS

    到其他一些字符串或字符。这样,\ n可用于sub / gsub:




    1. $ gawk BEGIN {RS=”dn } {gsub(“\n”,” “) ;print $0 }’ file

    2. </code>


    shell脚本的强大之处在于,如果您不知道如何以某种方式执行此操作,则可以通过其他方式执行此操作。很多时候,你需要考虑更多的事情,而不是在一个简单的问题上做出复杂的解决方案。



    关于gawk缓慢的事情……并将文件读入内存,我不知道这一点,但对我来说gawk似乎当时只用一行并且速度非常快(不像其他一些那么快) ,但写作和测试的时间也很重要)。



    我处理MB甚至GB的数据,我发现的唯一限制是行大小。


  3. 2# 老夫的少女心 | 2019-08-31 10-32



    您也可以使用此方法




    1. sed x;G;1!h;s/\n/ /g;$!d

    2. </code>


    说明




    1. x - which is used to exchange the data from both space (pattern and hold).
      G - which is used to append the data from hold space to pattern space.
      h - which is used to copy the pattern space to hold space.
      1!h - During first line wont copy pattern space to hold space due to \n is
      available in pattern space.
      $!d - Clear the pattern space every time before getting next line until the
      last line.

    2. </code>



    流:


    当第一行从输入获得时,进行交换,因此1进入保持空间并且\ n进入模式空间,然后将保持空间附加到模式空间,然后执行替换并删除模式空间。

    在第二行交换期间,2进入保持空间,1进入模式空间,然后

    G

    然后将保留空间附加到模式空间中

    h

    将模式复制到它并进行替换并删除。继续此操作,直到达到eof,然后打印精确结果。



  4. 3# 晴天?霹雳 | 2019-08-31 10-32



    用任何字符串替换换行符,并替换最后一个换行符



    纯洁的

    tr

    解决方案只能替换为单个字符,而且纯粹

    sed

    解决方案不会替换输入的最后一个换行符。以下解决方案修复了这些问题,并且对二进制数据似乎是安全的(即使使用UTF-8语言环境):




    1. printf 1\n2\n3\n |
      sed s/%/%p/g;s/@/%a/g | tr \n @ | sed s/@/
      /g;s/%a/@/g;s/%p/%/g

    2. </code>


    结果:




    1. 1
      2
      3

    2. </code>

  5. 4# 晴天3 | 2019-08-31 10-32



    使用

    tr

    代替?




    1. tr \n < input_filename

    2. </code>


    或完全删除换行符:




    1. tr -d \n < input.txt > output.txt

    2. </code>


    或者如果你有GNU版本(有很长的选项)




    1. tr delete \n < input.txt > output.txt

    2. </code>

  6. 5# Jacob | 2019-08-31 10-32



    我使用混合方法绕过换行符,使用tr替换带有制表符的换行符,然后用我想要的任何内容替换制表符。在这种情况下, ”


    “因为我正在尝试生成HTML中断。




    1. echo -e a\nb\nc\n |tr \n \t | sed s/\t/
      /g`

    2. </code>

  7. 6# 文艺青年3 | 2019-08-31 10-32




    1. tr \n

    2. </code>


    是命令。



    简单易用。


  8. 7# 1号 | 2019-08-31 10-32



    我发布了这个答案,因为我已经尝试了大部分的

    sed

    推荐上面提供的示例,在我的Unix框中对我不起作用并给我错误信息

    Label too long: {:q;N;s/\n/ /g;t q}

    。最后我提出了我的要求,因此在这里分享了适用于所有Unix / Linux环境: -




    1. line=$(while read line; do echo -n $line “; done < yoursourcefile.txt)
      echo $line |sed s/ //g’ > sortedoutput.txt

    2. </code>


    第一行将从文件中删除所有新行

    yoursourcefile.txt

    并将产生一条线。第二

    sed

    命令将从中删除所有空格。


  9. 8# biu~额 | 2019-08-31 10-32



    为响应上面的“tr”解决方案,在Windows上(可能使用的是Gnuwin32版本的tr),建议的解决方案:




    1. tr \n < input

    2. </code>


    我没有为我工作,它出错或实际上由于某种原因取代了\ n w /‘’。



    使用tr的另一个功能,“删除”选项-d确实有效:




    1. tr -d \n < input

    2. </code>


    或’\ r \ n’而不是’\ n’


  10. 9# 谦成 | 2019-08-31 10-32



    我不是专家,但我想

    sed

    你首先需要将下一行附加到模式空间中,bij使用“

    N

    “。从本书”高级sed命令“中的”多行模式空间“一节

    sed&amp; AWK

    (Dale Dougherty和Arnold Robbins; O’Reilly 1997;第107页

    预览

    ):




    多行Next(N)命令通过读取新的输入行并将其附加到模式空间的内容来创建多行模式空间。模式空间的原始内容和新输入行由换行符分隔。嵌入的换行符可以通过转义序列“\ n”以模式匹配。在多行模式空间中,元字符“^”匹配模式空间的第一个字符,而不是任何嵌入的换行符后面的字符。类似地,“$”仅匹配模式空间中的最终换行符,而不匹配任何嵌入换行符。执行Next命令后,控制权将传递给脚本中的后续命令。






    man sed





    [2addr] n的



    将下一行输入附加到模式空间,使用嵌入的换行符将附加材料与原始内容分开。请注意,当前行号会发生变化。




    我有

    用过这个

    搜索(多个)格式错误的日志文件,其中搜索字符串可以在“孤立的”下一行中找到。


  11. 10# 别烦我 | 2019-08-31 10-32



    为了使用awk替换所有换行符,而不将整个文件读入内存:




    1. awk ‘{printf “%s “, $0}’ inputfile

    2. </code>


    如果你想要一个最终换行符:




    1. awk ‘{printf “%s “, $0} END {printf \n”}’ inputfile

    2. </code>


    您可以使用空格以外的字符:




    1. awk ‘{printf “%s|”, $0} END {printf \n”}’ inputfile

    2. </code>

  12. 11# 青年@ | 2019-08-31 10-32



    三件事。






    1. tr

      (要么

      cat

      等等)绝对不需要。 (GNU)

      sed

      和(GNU)

      awk

      如果合并,可以完成99.9%的所需文本处理。





    2. stream!=基于行。

      ed

      是一个基于行的编辑器。

      sed

      不是。看到

      sed讲座

      有关差异的更多信息。大多数人都很困惑

      sed

      基于行,因为默认情况下,它对SIMPLE匹配的模式匹配不是很贪婪 - 例如,在进行模式搜索并用一个或两个字符替换时,它默认只替换它找到的第一个匹配(除非全局命令另有规定)。如果它是基于行的而不是基于STREAM的,那么甚至不会有全局命令,因为它一次只评估行。试试跑步

      ed

      ;你会发现差异。

      ed

      如果你想迭代特定的行(例如在for循环中),这是非常有用的,但大多数时候你只是想要

      sed






    3. 话虽如此,




      1. sed -e ‘{:q;N;s/\n/ /g;t q}’ file

      2.     </code>
      3.   </pre>
      4.   <P>
      5.     GNU中运行得很好
      6.      <code>
      7.       sed
      8.     </code>
      9.      版本4.2.1。上面的命令将用空格替换所有换行符。输入它很难看并且有点麻烦,但它工作得很好。该
      10.      <code>
      11.       {}
      12.     </code>
      13.     可以省略,因为它们仅出于理智原因而被包括在内。
      14.   </p>
      15. </LI>
      16. </醇>

  13. 12# 独奏♪ | 2019-08-31 10-32



    你可以用

    xargs

    它将取代它

    \n

    默认情况下有空格。



    但是,如果您的输入有任何情况,则会出现问题

    unterminated quote

    ,例如如果给定行上的引号不匹配。


  14. 13# star | 2019-08-31 10-32



    谁需要

    sed

    ?这里是

    bash

    办法:




    1. cat test.txt | while read line; do echo -n $line “; done

    2. </code>

  15. 14# 甲基蓝 | 2019-08-31 10-32



    使用Awk:




    1. awk BEGIN { o=\”\” } { o=o \” \” \$0 } END { print o; }”

    2. </code>

  16. 15# 哇塞 | 2019-08-31 10-32



    在GNU中使用此解决方案

    sed





    1. sed ‘:a;N;$!ba;s/\n/ /g file

    2. </code>


    这将在循环中读取整个文件,然后用空格替换换行符。



    说明:




    1. 通过创建标签

      :a




    2. 将当前和下一行附加到模式空间via

      N




    3. 如果我们在最后一行之前,则转移到创建的标签

      $!ba



      $!

      意味着不要在最后一行上这样做,因为应该有一个最后的换行符)。


    4. 最后,替换用模式空间(即整个文件)上的空格替换每个换行符。

    5. </醇>


      这是与BSD和OS X一起使用的跨平台兼容语法

      sed

      (按照

      @Benjie评论

      ):




      1. sed -e ‘:a -e N -e $!ba -e s/\n/ /g file

      2. </code>


      如您所见,使用

      sed

      对于这个否则简单的问题是有问题的。有关更简单和充分的解决方案,请参阅

      这个答案



  17. 16# 庸人自扰1 | 2019-08-31 10-32



    @OP,如果要替换文件中的换行符,可以使用dos2unix(或unix2dox)




    1. dos2unix yourfile yourfile

    2. </code>

  18. 17# 句号了哦哦 | 2019-08-31 10-32



    在Mac OS X上(使用FreeBSD sed):



    1.   # replace each newline with a space
    2. printf a\nb\nc\nd\ne\nf | sed -E -e :a -e $!N; s/\n/ /g; ta
      printf a\nb\nc\nd\ne\nf | sed -E -e :a -e $!N; s/\n/ /g -e ta

    3. </code>

  19. 18# My☀ | 2019-08-31 10-32



    我特别喜欢的解决方案是将所有文件附加到保留空间并替换文件末尾的所有换行符:




    1. $ (echo foo; echo bar) | sed -n H;${x;s/\n//g;p;}’
      foobar

    2. </code>


    然而,有人说我在一些sed实现中保持空间可能是有限的。


登录 后才能参与评论