如何将与模式匹配的行附加到上一行

如何将与模式匹配的行附加到上一行

前任:

输入文件

******************
.WER
+ aaa bbb ccc
+ ddd eee 
+ fff ggg hhh
******************
.SDF
+ zzz xxx yyy 
+ iii  
+ kkk lll
******************
.XCV
+ uuu vvv ggg 
+ hhh qqq 
+ rrr ttt jjj
******************

期望的输出:

******************
.WER aaa bbb ccc ddd eee fff ggg hhh
******************
.SDF zzz xxx yyy iii kkk lll
******************
.XCV uuu vvv ggg hhh qqq rrr ttt jjj
******************

我想将与模式“+”匹配的行附加到上一行,并将“+”替换为空格。

任何人都可以使用 awk 或 sed (甚至 grep)命令解决这个问题吗?

我是 Linux 初学者。请解释整个命令行的详细信息。

答案1

您用 /linux 标记了您的问题,因此您可能正在使用 GNU sed。然后您可以使用该-z选项在一个缓冲区中处理整个文件并使用:

sed -z 's/\n+//g'

这意味着s将每个换行符 ( \n) 后跟的+符号替换为空,这意味着连接从前+一行开始的行,并删除+.

答案2

我带着这个来的awk

awk 'BEGIN {RS=""}{gsub(/\n\+/,"", $0); print $0}' file

输出:

******************
.WER aaa bbb ccc ddd eee  fff ggg hhh
******************
.SDF zzz xxx yyy  iii   kkk lll
******************
.XCV uuu vvv ggg  hhh qqq  rrr ttt jjj
******************

答案3

在每个 UNIX 机器上的任何 shell 中使用任何 awk,一次仅将 1 行读入内存(到目前为止发布的其他解决方案将整个输入文件一次读入内存):

$ awk '{printf "%s%s", (sub(/^\+/,"") ? "" : ors), $0; ors=ORS} END{print ""}' file
******************
.WER aaa bbb ccc ddd eee fff ggg hhh
******************
.SDF zzz xxx yyy iii kkk lll
******************
.XCV uuu vvv ggg hhh qqq rrr ttt jjj
******************

相关内容