0

我需要打印所有将以空格“^”开头的行与之前的行合并的行。使用 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                            
4

3 回答 3

1

使用(在您的情况下比Suhas 的sed答案更便携):

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

-0777读取字符串中的整个文件

替换修饰符在那里是强制性的。

于 2013-03-21T13:45:10.450 回答
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 设置为一些未出现在输入文件中的控制字符。

于 2013-03-21T14:01:28.260 回答
0

尝试这个:

sed -e :a -e '$!N;s/\n\s/ /;ta' -e 'P;D' <filename>
于 2013-03-21T13:28:20.713 回答