特定のX線(パターンあり)から別の特定のY線(パターンあり)にのみ移動する猫

特定のX線(パターンあり)から別の特定のY線(パターンあり)にのみ移動する猫

「の小さな拡張の質問です。大きなファイルのcat行xから行yまで":

大容量ファイル(2〜3GB)があります。私は単に「foo:」のある行から「goo:」のある行にcat/printしたいと思います。 「foo:」と「goo:」がファイルに一度だけ現れるとします。 「foo:」は「goo:」につながります。

これがこれまで私のアプローチです。

  • まず、「foo:」と「goo:」を含む行を探します。grep -nr "foo:" bigfile
  • 返品123456: foo: hello world!654321: goo: good bye!
  • これらの開始行と終了行番号との違い(654321-123456 = 530865)がわかったら、オプションの猫を実行できます。
  • tail -n+123456 bigfile | head -n 530865

私の質問は、行番号定数を式(たとえばgrep ...)に効率的に置き換える方法です。

簡単なPythonスクリプトを書くことができますが、組み合わせたコマンドだけを使って実装したいと思います。

ベストアンサー1

sed -n '/foo/,/goo/p;/goo/q' <bigfile

これにより、対応する行だけが印刷されます。行番号が必要な場合は、1つを追加できます=

sed -n '/foo/=;/goo/=;//q' <bigfile

呼び出されると入力に合うqので重要です。それ以外の場合、infileは最後まで読み取られます。qsed

その行を印刷したくない場合は、foo/goo次のようにします。

GNUの使用sed:

sed -n '/foo/,/goo/!d;//!p;/goo/q
' <<\DATA
line1
foo 
line3
line4
line5
goo 
line7
DATA

出力

line3
line4
line5

その他:

sed -n '/foo/G;/\n/,/goo/!d;//q;/\n/!p 
' <<\DATA
line1
foo 
line3
line4
line5
goo 
line7
DATA    

出力

line3
line4
line5

しかし、どちらかが検索の最後の行に出会うと、入力も終了します。

おすすめ記事