5

我需要基于模式使用 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}' 文件

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

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 

……

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

斯里苏里亚

4

3 回答 3

20

这可能对您有用:

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

解释:

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

另一种 awk oneliner:

awk 'BEGIN{RS="  "}{gsub(/\n\n\+/,"")}1' yourFile
于 2012-07-02T09:25:49.043 回答
0

potong 的回答对我不起作用,但类似的工作:

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

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

于 2014-01-22T23:19:17.053 回答