【问题标题】:Sed to combine N text lines separated by blank lines?Sed合并N个由空行分隔的文本行?
【发布时间】:2017-02-05 15:27:25
【问题描述】:

我搜索了一下,但没有找到针对这种特定情况的解决方案。给定一个输出任意数量的非空行组的管道分隔单个空行,是否存在将非空行组组合成的 sed 单行(或 awk 单行或 perl 单行)单行,同时保留空白行?比如输入

one
two

three
four
five

six

seven
eight

应该输出为

one two

three four five

six

seven eight

提前感谢所有回复的人。

【问题讨论】:

    标签: sed


    【解决方案1】:

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

    sed '/./{:a;N;s/\n\(.\)/ \1/;ta}' file
    

    如果该行不为空,则读取下一行,如果不为空,则用空格替换换行符并重复,否则打印模式空间。如果该行首先为空,则打印空行:这适合空的第一行,如果不是这种情况,则非空行之间只有一个空行:

     sed ':a;N;s/\n\(.\)/ \1/;ta' file
    

    足够了。

    【讨论】:

      【解决方案2】:

      Perl 单行

      perl -00 -lpe 'tr/\n/ /'
      

      在哪里

      • -00 以空行分隔的段落读取输入
      • -l 自动处理换行符
      • -p处理后自动打印每条记录
      • tr/\n/ /' 将所有换行符更改为空格

      【讨论】:

        【解决方案3】:

        awk 解决方案:将 RS 设置为空行,将 ORS 设置为两个新行,如果您不希望在输出中有空行,只需从下面的命令远程 ORS。

        awk -v RS= -v ORS="\n\n" '{$1=$1}1' foo.in
        one two
        
        three four five
        
        six
        
        seven eight
        

        【讨论】:

          【解决方案4】:

          修改示例输入以包含多个连续的空白行

          $ cat ip.txt 
          one
          two
          
          
          three
          four
          five
          
          six
          
          seven
          eight
          

          awk解决方案:

          $ awk -v RS= -v ORS="\n\n" '{gsub("\n"," ");打印}' ip.txt 一二 三四五 六 七八

          同时保留多个空白:

          $ perl -0777 -pe 's/[^\n]\K\n(?=^[^\n])/ /mgs' ip.txt 
          one two
          
          
          three four five
          
          six
          
          seven eight
          
          • -0777 会将整个文件作为一个字符串,因此如果输入文件大到无法放入内存,则不适合
          • 正则表达式匹配非换行符,后跟换行符,下一行不是空行。 lookbehind 和 lookahead 用于轻松替换并避免递归搜索

          【讨论】:

            猜你喜欢
            • 2012-12-10
            • 2016-07-08
            • 1970-01-01
            • 2011-04-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-08-22
            • 2011-01-16
            相关资源
            最近更新 更多