一致後にファイルの最後まですべての行を印刷するには?

一致後にファイルの最後まですべての行を印刷するには?

入力ファイル1は次のようになります。

dog 123 4335
cat 13123 23424 
deer 2131 213132
bear 2313 21313

一致のパターンother filedog 123 4335file2のパターンに似ています)を提供します。

行のパターンを一致させ、dog 123 4335一致する行がないすべての行を印刷した後、出力は次のようになります。

cat 13123 23424
deer 2131 213132
bear 2313 21313

アドレスなしでパターンのみを使用する場合は、行を一致さ1s せて印刷する方法は?

答え1

実際には、次のものを使用できます。Aet3miirahの答えほとんどの時間とアレクセイの答えラインナビゲーションに適しています(また、一緒に使用することができますless)。 OTOH、私は他のアプローチが大好きです(その逆です)。ザイルズの答え):

sed -n '/dog 123 4335/,$p'

この-nフラグを使用して呼び出すと、sed処理する行はデフォルトで印刷されなくなります。次に、2 アドレス形式を使用します。これは、一致する行から始まり、/dog 123 4335/ファイルの終わりまで(とマーク)コマンドを適用することを意味します$。問題のコマンドは、p現在行を印刷することです。したがって、これは「一致する行から/dog 123 4335/最後まですべての行を印刷する」ことを意味します。

答え2

ファイルがかなり短い場合は、grep次のように動作します。

grep -A5000 -m1 -e 'dog 123 4335' animals.txt

5000は、最初の一致が見つかり、次の5000行で出力されるため、「かなり短い」と推測されますgrep(ファイルにはあま​​り行が必要ありません)。一致自体が欲しくない場合は、切り取る必要があります。

grep -A5000 -m1 -e 'dog 123 4335' animals.txt | tail -n+2


最初の一致を望まずに最後の一致を区切り文字として使用するには、次のコマンドを使用できます。

tac animals.txt | sed -e '/dog 123 4335/q' | tac

行はanimals.txt行を含む行の逆順で読み取られ、出力され、dog 123 4335再び逆順になり、正しい順序に復元されます。

同様に、結果に一致が必要ない場合は、tailを追加してください。 (終了する前にバッファを削除するようにsed式を複雑にすることもできます。)

答え3

GNUを使用して行全体をパターンに一致させようとすると、sed次のように動作します。

sed -n '/^dog 123 4335$/ { :a; n; p; ba; }' infile

標準同等:

sed -ne '/^dog 123 4335$/{:a' -e 'n;p;ba' -e '}' infile

以下を入力(infile):

cat 13123 23424 
deer 2131 213132
bear 2313 21313
dog 123 4335
cat 13123 23424 
deer 2131 213132
bear 2313 21313

出力は次のとおりです

cat 13123 23424 
deer 2131 213132
bear 2313 21313

説明する:

  • /^dog 123 4335$/目的のパターンを検索してください。
  • :a; n; p; ba;np入力()から新しい行を取り、それを印刷()してからラベルaに分岐するループ:a; ...; ba;

修正する

これはあなたのニーズにもっと近い答えです(例:file2のパターン、file1のgrep)。

tail -n +$(( 1 + $(grep -m1 -n -f file2 file1 | cut -d: -f1) )) file1

埋め込み grep と cut は、file2 でパターンを含む最初の行を探します。この行番号は、パターンのある行をスキップするためにテールに1を加えた値として渡されます。

最初のゲームの代わりに最後のゲームから始めたい場合は、次のようにします。

tail -n +$(( 1 + $(grep -n -f file2 file1 | tail -n1 | cut -d: -f1) )) file1

tailのすべてのバージョンがプラス記号をサポートしているわけではありません。

答え4

$ more +/"dog 123 4335" file1

関連情報