我需要打印所有行合并以白色空格“^”开头的行和之前的行/ 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
答案 0 :(得分:1)
使用perl(在您的情况下比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设置为一些未出现在输入文件中的控件字符。