sed:多行条件合并

问题描述 投票:0回答:3

我需要根据模式使用 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/ +/ /g)

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

sed -e '{:a; N; s/ +/ /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 

....

sed merge line
3个回答
23
投票

这可能对你有用:

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

说明:

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

3
投票

替代 awk oneliner:

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

0
投票

potong的答案对我不起作用,但类似的东西有效:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.