2013-03-21 92 views
0

合并图案行/我需要打印所有行合并行与/ 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

http://whathaveyoutried.com?你读过[faq](http://stackoverflow.com/faq)吗? – 2013-03-21 13:25:37

+0

我试过sed -n'/^[az]/{x; p};/^ [^ az]/{H; x; s/\ n \ s * \([^ az] \)/ \ 1/; x}; $ {x; p}',但它给了我“无法解析”,我认为它不会做任何好事来发布它:) – Alberto 2013-03-21 13:38:36

+0

它总是**更好地告诉我们你有什么试过! – 2013-03-21 13:39:39

回答

1

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

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

-0777在一个字符串

substitution modifiers是强制性的阅读存在的整个文件。

+1

它工作完美!非常感谢你 – Alberto 2013-03-21 13:50:44

0

试试这个:

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

在Linux中,您的解决方案有效。但不幸的是,我在Unix(HPUX)中工作,并没有工作。任何想法在Unix中做同样的事情? – Alberto 2013-03-21 13:37:18

+0

试试这个吗? 'sed':a; $!N; s/\ n \ s//; ta; P; D'' – 2013-03-21 13:40:33

+0

sed:标签:a; $!N; s/\ n \ s//; ta; P; D大于八个字符。 – Alberto 2013-03-21 13:42:49

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'阅读整个文件作为@人造卫星的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到不会出现在你的输入文件中的一些控制字符。