キーワード2がない場合は、キーワード1の後の行を削除します。

キーワード2がない場合は、キーワード1の後の行を削除します。

"/test1/end"の後にtest1を含まない行を削除する方法

test_long_sentence.txt:

20  /test1/catergory="Food"
20  /test1/target="Adults, \"Goblins\", Elderly,
Babies, \"Witch\",
Faries"
20  /test1/type="Western"
20  /test1/theme="Halloween"
20  /test1/end=category
**This is some unwanted data blah blah blah**
20  /test1/Purpose=
20  /test1/my_purpose="To create 
a fun-filled moment"
20  /test1/end=Purpose
...

予想出力:

20  /test1/catergory="Food"
20  /test1/target="Adults, \"Goblins\", Elderly,
Babies, \"Witch\",
Faries"
20  /test1/type="Western"
20  /test1/theme="Halloween"
20  /test1/end=category
20  /test1/Purpose=
20  /test1/my_purpose="To create 
a fun-filled moment"
20  /test1/end=Purpose
...

私は試した:

grep -A1 'end' test_long_sentence.txt| sed 'test1/!d' test_long_sentence.txt > output.txt

答え1

努力する:

$ awk '/test1/{f=0} !f{print}  /test1\/end/{f=1}' sentence.txt  
20  /test1/catergory="Food"
20  /test1/target="Adults, \"Goblins\", Elderly,
Babies, \"Witch\",
Faries"
20  /test1/type="Western"
20  /test1/theme="Halloween"
20  /test1/end=category
20  /test1/Purpose=
20  /test1/my_purpose="To create 
a fun-filled moment"
20  /test1/end=Purpose

どのように動作しますか?

awk が起動すると、未定義のすべての変数のデフォルト値は false です。したがって、awkが起動するとエラーが発生しますf。その後、awkは各行を順番に読み込み、次の3つのコマンドを実行します。

  • /test1/{f=0}

    含まれるすべての行に対してtest1変数をffalse(0)に設定します。

    印刷する行の範囲内にある場合はffalseに設定されます。

  • !f{print}

    false の場合、f現在の行を印刷します。

  • /test1\/end/{f=1}

    含まれている行にtrue(1)をtest1/end設定します。f

    これは、含まれる行に達するまで後続の行を印刷しないことを示しますtest1

変数の使用

awk -v a="test1" -v b="test1/end"  '$0~a{f=0} !f{print}  $0~b{f=1}' sentence.txt

関連情報