1. ホーム
  2. shell

[解決済み] awk/sed で複数回発生する可能性のある 2 つのマーカーパターンの間の行を選択する方法

2022-05-15 05:19:55

質問

使用方法 awk または sed 2つの異なるマーカーパターンの間にある線を選択するにはどうしたらよいですか。これらのパターンでマークされたセクションが複数ある可能性があります。

例えば ファイルに

abc
def1
ghi1
jkl1
mno
abc
def2
ghi2
jkl2
mno
pqr
stu

そして、開始パターンは abc で、終了パターンは mno というように出力する必要があります。

def1
ghi1
jkl1
def2
ghi2
jkl2

sedを使って一度だけパターンにマッチさせています。

sed -e '1,/abc/d' -e '/mno/,$d' <FILE>

の中で、何か方法はないでしょうか? sed または awk でファイルの終わりまで繰り返し実行しますか?

どのように解決するのですか?

使用方法 awk を使い、必要なときに印刷を開始するようにフラグを立てます。

$ awk '/abc/{flag=1;next}/mno/{flag=0}flag' file
def1
ghi1
jkl1
def2
ghi2
jkl2

これはどのように機能するのでしょうか?

  • /abc/ は、このテキストを持つ行にマッチし、さらに /mno/ と同様です。
  • /abc/{flag=1;next}flag が設定されると、テキスト abc が見つかったら そして、その行をスキップする。
  • /mno/{flag=0} をアンセットします。 flag というテキストがある場合 mno が見つかります。
  • 最後の flag はデフォルトのアクションを持つパターンで、これは print $0 : もし flag が 1 であれば、その行が表示されます。

より詳細な説明と例、およびパターンが表示される場合とされない場合については 2つのパターンの間の行を選択するには? .