一致する項目を含む最初の行の前のすべての行を削除しますか?

一致する項目を含む最初の行の前のすべての行を削除しますか?

正規表現文字列を使用して、一致を含む最初の行の前のすべての行をどのように削除できますか?たとえば、これをどのように変更できますか?

lost
load
linux
loan
linux

以下を入力してください:

linux
loan
linux

私は試した:

echo "lost
load
linux
loan
linux" | sed -e 's/.*^li.*$//g'

しかし、何も変更せずに次を返します。

lost
load
linux
loan
linux

一致するものがない場合は何も出力しないように動作したいと思います。

ベストアンサー1

一方向POSIXly:

$ echo "lost
load
linux
loan
linux" | sed -e/linux/\{ -e:1 -en\;b1 -e\} -ed

またはより短く:

sed -n '/linux/,$p'

短く:

sed '/linux/,$!d'

短いバージョンより長いバージョンを好む理由を疑問に思う読者のために、長いバージョンはファイルの残りの部分に対してI / Oのみを実行しますが、範囲を使用すると2番目のアドレスがregexの場合パフォーマンスが低下し、正規表現は次のようになります。を試してください。必要以上に一致させます。

考慮する:

$ time seq 1000000 | sed -ne '/^1$/{' -e:1 -en\;b1 -e\}
=====
JOB sed -e '/^1$/,$d'
87%    cpu
0.11s real
0.10s user
0.00s sys

そして:

$ time seq 1000000 | sed -e '/^1$/,/1000000/d'
=====
JOB sed -e '/^1$/,/1000000/d'
96%    cpu
0.24s real
0.23s user
0.00s sys

2つのバージョンの違いを確認できます。複雑な正規表現の場合、これは大きな違いを生み出します。

おすすめ記事