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 -e :a -e '$!N;s/\n\s/ /;ta' -e 'P;D' <filename>
于 2013-03-21T13:28:20.713 に答える
0

sedは、1行で簡単に置き換えるための優れたツールです。それ以外の場合は、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

上記は各入力行を一度に1つずつ処理し、ファイル全体をメモリに読み込むことはありませんが、それが許容できる場合はRS='\0'、@sputnikのperlスクリプトに相当するGNUawk(ファイル全体を文字列として読み取るため)を次に示します。

$ 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 に答える