【问题标题】:sed: conditional merge of multiple linessed:多行的条件合并
【发布时间】:2012-07-02 09:00:39
【问题描述】:

我需要基于模式使用 sed 合并文件的行。例如:

输入文件:

X1 A B C D E F

\+ G H I J 1 

\+ LK T PP E OO 2

X2 DDF F Y 

\+ J W Q 

....

预期输出:

X1 A B C D E F G H I J 1 LK T PP E OO 2

X2 DDF F Y J W Q 

..

我想在 vi 编辑器中等价于 wat (:%s/\n+/ /g)

在网上搜索我找到了一个解决方案,从逻辑上来说应该可行

sed -e '{:a; N; s/\n+/ /g; ta}' infile

但是这个命令违背了我的理解和逻辑,并且产生了输出

X1 A B C D E F

\+ G H I J 1 LK T PP E OO 2
X2 DDF F Y 

\+ J W Q 

....

欢迎提出任何想法,并在此先感谢

斯里兰卡

【问题讨论】:

    标签: merge sed lines


    【解决方案1】:

    这可能对你有用:

    sed ':a;$!N;s/\n+//;ta;P;D' file
    

    解释:

    • :a 是循环占位符
    • $!N 表示如果不是文件末尾,则将下一行附加到当前行。
    • s/\n+// 表示删除一行结束后跟一个加号
    • ta 表示如果最后一个替换工作分支到 a 循环占位符
    • P 打印到第一个换行符。
    • D 删除直到并包括第一个换行符。

    【讨论】:

      【解决方案2】:

      另一种 awk oneliner:

      awk 'BEGIN{RS="  "}{gsub(/\n\n\+/,"")}1' yourFile
      

      【讨论】:

        【解决方案3】:

        potong 的回答对我不起作用,但类似的方法有效:

        sed -e :a -e '$!N;s/\n+//;ta' -e 'P;D' file
        

        这里有好的 sed 文档: http://sed.sourceforge.net/sedfaq3.html

        【讨论】:

          猜你喜欢
          • 2017-03-08
          • 2017-04-12
          • 2013-04-13
          • 1970-01-01
          • 2021-02-03
          • 2014-10-05
          • 2011-04-06
          • 2020-03-10
          • 2021-11-21
          相关资源
          最近更新 更多