"/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
変数をf
false(0)に設定します。印刷する行の範囲内にある場合は
f
falseに設定されます。!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