sedを使用してファイルから1行を抽出する

sedを使用してファイルから1行を抽出する

sed「start」の入力ファイルを検索し、「next」を含む行を見つけて、次の行を表示するスクリプトを作成するにはどうすればよいですか?このような:

[user]$ cat test.txt
start
next
This line should print
Ignore this


[user]$ display.sed test.txt
This line should print

[user]$ cat test1.txt
Ignore this
next
Ignore this
start
Ignore this
next
This line should print
Ignore this
next
Too late so ignore this too
start
Ignore this too

[user]$ display.sed test1.txt
This line should print

答え1

範囲(最初からstartファイルの終わりまで)を使用して、dその範囲内で一致しないすべての行を削除できますnext。行が一致する場合は、n次の行を読んでp印刷してから、q次のように入力します。

sed -n '/start/,${
/next/!d;n;p;q
}' infile

あなたが本当に欲しいのは、次のものを含むファイルだと思いますdisplay.sed

#!/bin/sed -nf

/start/,${
/next/!d;n;p;q
}

答え2

使用awkGNU以外の環境でも機能するため、この場合に適しています。アッ実装:

awk '/^start/{ f=1 }f && /^next/ && getline nl>0{ print nl; exit }' test.txt
  • /^start/{ f=1 }f=1- 遭遇したラインにアクティブフラグを設定します。start

  • f && /^next/ && getline nl>0-next行が見つかった場合(前のstart行と一致 - アクティブフラグで保証f) - 次の必須行が存在することを確認するgetline nl>0

  • nl("needed line") - この行は次の行を含みます。next


出力(現在の入力用):

This line should print

答え3

何についてgrep?このコマンドが本当に欲しいものかどうか説明を追加しましょう。

grep -Pzo '(?s)start.*?next\n\K.*?\n' input.txt

入力(2つの例の組み合わせ)

start
next
This line should print
Ignore this
Ignore this
next
Ignore this
start
Ignore this
next
This line should print
Ignore this
next
Too late so ignore this too 
start
Ignore this too 

出力

This line should print
This line should print

関連情報