一時ファイルを使用せずに、出力の最初のN行を最後に移動します。

一時ファイルを使用せずに、出力の最初のN行を最後に移動します。

次のコマンドの出力を想像してみてください。

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 '代替ですedr出力を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それ以外の場合は、パターンスペースを保持バッファの内容()で上書きし、guitsqを使用します(現在のパターンスペースを印刷した後)。

答え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/stdinPOSIXと互換性があります。

(POSIXで指定されているかどうかはわかりませんが、/dev/stdinLinuxとMac OS Xの両方に存在することがわかりました。)

sedexこれは、使用された予約済みスペースと比較して読みやすくなります。 「この行を最後に移動」と言えばそうなります。 (残りのコマンドは「印刷バッファ」と「終了」を意味し、これもかなり読みやすいです。)

注:ex2行未満を入力すると、上記のコマンドは失敗します。

追加資料:

関連情報