合并图案线/ s与之前的行

时间:2013-03-21 13:22:18

标签: regex sed awk

我需要打印所有行合并以白色空格“^”开头的行和之前的行/ s。使用awk或sed将是完美的。

自:

ext_bus     3  0/1/1/0/1/1    c8xx           CLAIMED
                             /dev/c8xx3
target      4  0/1/1/0/1/1.0  tgt            CLAIMED
disk        4  0/1/1  sdisk          CLAIMED
                             /dev/c3t0   /dev/c2t0
                             /dev/c4t0

要:

ext_bus     3  0/1/1/0/1/1    c8xx           CLAIMED /dev/c8xx3                          
target      4  0/1/1/0/1/1.0  tgt            CLAIMED
disk        4  0/1/1  sdisk          CLAIMED /dev/c3t0   /dev/c2t0 /dev/c4t0                            

3 个答案:

答案 0 :(得分:1)

使用(在您的情况下比Suhas's sed answer更便携):

perl -0777 -pe 's/\n\s+/ /gms'

-0777以字符串

读取整个文件

substitution modifiers是强制性的。

答案 1 :(得分:0)

试试这个:

sed -e :a -e '$!N;s/\n\s/ /;ta' -e 'P;D' <filename>

答案 2 :(得分:0)

sed是单行简单替换的绝佳工具。除此之外,只需使用awk:

$ awk '{printf "%s%s", (gsub(/^[[:space:]]+/,"")?" ":nl), $0; nl="\n"} END{print ""}' file
ext_bus     3  0/1/1/0/1/1    c8xx           CLAIMED /dev/c8xx3
target      4  0/1/1/0/1/1.0  tgt            CLAIMED
disk        4  0/1/1  sdisk          CLAIMED /dev/c3t0   /dev/c2t0 /dev/c4t0

上面一次处理一个输入行,并没有将整个文件读入内存,但如果可以接受,那么这里是GNU awk(用于RS='\0'将整个文件作为字符串读取)相当于如果有人关心的话,@ sputnik的perl脚本:

$ gawk -v RS='\0' -v ORS= '{gsub(/\n\s+/," ")}1' file
ext_bus     3  0/1/1/0/1/1    c8xx           CLAIMED /dev/c8xx3
target      4  0/1/1/0/1/1.0  tgt            CLAIMED
disk        4  0/1/1  sdisk          CLAIMED /dev/c3t0   /dev/c2t0 /dev/c4t0

在非gawk awks中,只需将RS设置为一些未出现在输入文件中的控件字符。