![如何将与模式匹配的行附加到上一行](https://linux22.com/image/159711/%E5%A6%82%E4%BD%95%E5%B0%86%E4%B8%8E%E6%A8%A1%E5%BC%8F%E5%8C%B9%E9%85%8D%E7%9A%84%E8%A1%8C%E9%99%84%E5%8A%A0%E5%88%B0%E4%B8%8A%E4%B8%80%E8%A1%8C.png)
前任:
输入文件
******************
.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
******************