次のコマンドの出力を想像してみてください。
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
を使用します(現在のパターンスペースを印刷した後)。
答え2
離れてawk
いる:
cmd | awk -v n=3 '
NR <= n {head = head $0 "\n"; next}
{print}
END {printf "%s", head}'
特典を超えています。@don_crisstiのsed
アプローチ出力にn
ライン数が少なくても動作します(ライン出力)。
答え3
私はすでにそれを持っており、xclip
次のようにすることができます:
./a_command | xclip -in && xclip -o | tail -n +3 && xclip -o | head -n 2
説明は次のとおりです。
xclip - command line interface to X selections (clipboard)
NAME
xclip - command line interface to X selections (clipboard)
SYNOPSIS
xclip [OPTION] [FILE]...
DESCRIPTION
Reads from standard in, or from one or more files, and makes the data available as an X selection for pasting into X applications. Prints current X selection to standard out.
-i, -in
read text into X selection from standard input or files (default)
-o, -out
prints the selection to standard out (generally for piping to a file or program)
答え4
POSIXを使用してくださいex
。はい、ファイル編集用ですが、パイプラインで動作します。
printf %s\\n 111 222 333 444 555 | ex -sc '1,2m$|%p|q!' /dev/stdin
これにより、パイプラインの先頭または末尾に任意のコマンドを追加でき、同様に機能します。さらに、の存在を考慮すると、/dev/stdin
POSIXと互換性があります。
(POSIXで指定されているかどうかはわかりませんが、/dev/stdin
LinuxとMac OS Xの両方に存在することがわかりました。)
sed
ex
これは、使用された予約済みスペースと比較して読みやすくなります。 「この行を最後に移動」と言えばそうなります。 (残りのコマンドは「印刷バッファ」と「終了」を意味し、これもかなり読みやすいです。)
注:ex
2行未満を入力すると、上記のコマンドは失敗します。
追加資料: