次のコマンドの出力を想像してみてください。
44444
55555
11111
22222
33333
最初のN行(上記の例の最初の2行)を取り出して最後に追加するにはどうすればよいですか?一時ファイルを使用しないでください(だからパイプを使用してください)?
11111
22222
33333
44444
55555
これはこれです| sed -n '3,5p;1,2p'
(sedはコマンドの順序を気にしないので、明らかに動作しません)。
ベストアンサー1
この行を保持バッファにコピーして削除します。次に、最後の行で保持バッファの内容をパターン空間に追加します。
some command | sed '1,NUMBER{ # in this range
H # append line to hold space and
1h # overwrite if it's the 1st line
d # then delete the line
}
$G' # on last line append hold buffer content
gnu sed
次のように書くことができます。
some command | sed '1,NUMBER{H;1h;d;};$G'
これはol '代替ですed
(r
出力をsome command
テキストバッファに書き込んでから、次の行をm
スキップします)。1,NUMBER
$
ed -s <<IN
r ! some command
1,NUMBERm$
,p
q
IN
指摘したように、NUMBER
出力が+1行未満の場合は失敗します。より安定した方法は次のとおりです(gnu sed
構文)。
some command | sed '1,NUMBER{H;1h;$!d;${g;q;};};$G'
これは、最後の行()以外の範囲の行だけを削除します。$!d
それ以外の場合は、パターンスペースを保持バッファの内容()で上書きし、g
uitsq
を使用します(現在のパターンスペースを印刷した後)。