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

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

我尝试失败:

sed 's#n# #g' file
sed 's#^$# #g' file

我如何解决它?


在GNU sed使用此解决方案:

sed ':a;N;$!ba;s/n/ /g' file

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

说明:

  • 通过:a创建标签:a
  • 通过N追加当前行和下一行到模式空间。
  • 如果我们在最后一行之前,分支到创建的标签$!ba$!意味着不要在最后一行执行它,因为应该有最后一行)。
  • 最后,替换用模式空间上的空格替换每一个换行符(这是整个文件)。
  • 以下是跨平台兼容的语法,可与BSD和OS X的sed (根据@Benjie评论):

    sed -e ':a' -e 'N' -e '$!ba' -e 's/n/ /g' file
    

    tr代替?

    tr 'n' ' ' < input_filename
    

    或者完全删除换行符:

    tr -d 'n' < input.txt > output.txt
    

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

    tr --delete 'n' < input.txt > output.txt
    

    快速回答:

    sed ':a;N;$!ba;s/n/ /g' file
    
  • 创建一个标签'a'
  • N将下一行追加到模式空间
  • $! 如果不是最后一行, ba分支(转到)标签'a'
  • 替身,/ N /正则表达式新线,/ /通过的空间中,/克全局匹配(多次它可以)
  • sed将循环执行第1步到第3步,直到它到达最后一行,将所有行放入模式空间,其中sed将替换所有 n个字符


    替代品

    与sed不同的是,所有替代方案都不需要达到开始该过程的最后一行

    bash ,慢

    while read line; do printf "%s" "$line "; done < file
    

    perl ,sed般的速度

    perl -p -e 's/n/ /' file
    

    tr ,比sed更快,只能由一个字符替换

    tr 'n' ' ' < file
    

    ,tr样速度,只能由一个字符替换

    paste -s -d ' ' file
    

    awk ,tr-like的速度

    awk 1 ORS=' ' file
    

    其他类似于“echo $(<file)”的选项很慢,仅适用于小文件,需要处理整个文件以开始进程。


    来自sed的长答案 FAQ 5.10:

    5.10。 为什么我无法使用 n转义匹配或删除换行符
    序列? 为什么我不能使用 n匹配2行或更多行?

    n将永远不会匹配行尾的换行符,因为
    换行之前始终剥离换行符
    模式空间。 要将2行或更多行写入模式空间,请使用
    'N'命令或类似的东西(比如'H; ...; g;')。

    Sed的工作原理是这样的:sed一次只读一行,剔除掉
    终止换行符,将剩下的内容放入模式空间中
    sed脚本可以解决或改变它,并且当模式空间
    被打印,追加一个换行符到标准输出(或一个文件)。 如果
    模式空间完全或部分用'd'或'D'删除,
    在这种情况下不会添加换行符。 因此,脚本就像

      sed 's/n//' file       # to delete newlines from each line             
      sed 's/n/foon/' file  # to add a word to the end of each line         
    

    将永远不会工作,因为后面的换行符被删除了
    该行被放入模式空间。 为了执行上述任务,
    改用这些脚本之一:

      tr -d 'n' < file              # use tr to delete newlines              
      sed ':a;N;$!ba;s/n//g' file   # GNU sed to delete newlines             
      sed 's/$/ foo/' file           # add "foo" to end of each line          
    

    由于GNU sed以外的sed版本对大小有限制
    模式缓冲区,Unix'tr'工具在这里是首选。
    如果文件的最后一行包含换行符,那么GNU sed将会添加
    该输出的新行,但删除所有其他,而tr会
    删除所有换行符。

    要匹配两行或更多行的块,有三个基本选项:
    (1)使用'N'命令将下一行添加到模式空间;
    (2)使用'H'命令至少两次追加当前行
    到保留空间,然后从保存空间中检索行
    与x,g或G; 或(3)使用地址范围(参见上面的3.3节)
    匹配两个指定地址之间的行。

    选择(1)和(2)会将 n放入模式空间中
    可以根据需要进行处理('s / ABC nXYZ / alphabet / g')。 一个例子
    使用'N'删除一行代码块出现在4.13节
    (“如何删除一段特定的连续行?”)。 这个
    可以通过将delete命令更改为某些内容来修改示例
    其他,如'p'(print),'i'(插入),'c'(更改),'a'(追加),
    或's'(替代)。

    选项(3)不会将 n放入模式空间,但它确实如此
    匹配一连串的连续线,所以它可能是你没有
    甚至需要 n找到你要找的东西。 自从GNU sed
    版本3.02.80现在支持这种语法:

      sed '/start/,+4d'  # to delete "start" plus the next 4 lines,           
    

    除了传统的'/ from here /,/ to there / {...}'范围之外
    地址,可能完全避免使用 n。

    链接地址: http://www.djcxy.com/p/47125.html

    上一篇: How can I replace a newline (\n) using sed?

    下一篇: Non greedy (reluctant) regex matching in sed?