前任:
输入文件
******************
.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
******************