2013-03-21 57 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到不會出現在你的輸入文件中的一些控制字符。