web-dev-qa-db-ja.com

`sed`を使用してファイルの最初の行を印刷および削除する

を使用してファイルの最初の行を印刷できます

_sed -n 1p file.txt
_

を使用してファイルの最初の行を削除できます

_sed -i 1d file.txt
_

sedで印刷して削除する方法はありますか? FIFO pop()またはPerlのshiftのようなものです。

7
Andrew Cheong

コマンドwを使用して、いくつかの行を別の出力ファイルに書き込むことができます。 Linuxおよびその他の多くのUNIXバリアントでは、/dev/stdoutはプログラムの標準出力です。これは、sedが-iオプションを使用して書き込む場所ではありません。システムに/dev/stdoutまたは/dev/fd/1などのバリアントがない場合は、名前付きパイプに書き込むことができます。

sed -i -e '1 w /dev/stdout' -e '1d' file.txt

この回答は、Gillesの回答を拡張したものです。

アドレスを2回書き込む必要はあまりありません。最初の行を削除するだけのこの例では問題なく機能しますが、ファイルから「抽出」したい行の検索パターンがより複雑な場合、その方法はさらに問題になります。 。アドレスを2回書き込む代わりに、中括弧を使用して、同じアドレスでwコマンドとdコマンドの両方を実行できます。元の例を使用すると、次のようになります。

sed -i -e '1{w /dev/stdout' -e 'd}' file.txt

より一般的には:

sed -i -e '/some long regex/{w /dev/stdout' -e 'd}' file.txt
2
dhakimian

残念ながらこれは不可能です。基本的に、sedからの出力が2つの異なる場所に移動するように要求しています。最初の行をsedのstdoutに出力し、残りの行を元に戻します。ファイル自体。ただし、sedの出力は1か所にしか行くことができません(デフォルトではstdoutになり、-iオプションを指定すると、ファイルに戻ります)。

幸いなことに、2つのコマンドを個別に実行することによる欠点はありません。

0
AGWA