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
使用awk
GNU以外の環境でも機能するため、この場合に適しています。アッ実装:
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