如果keyword2不存在则删除keyword1之后的行

如果keyword2不存在则删除keyword1之后的行

如何删除“/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 将依次读取每一行并执行以下三个命令:

  • /test1/{f=0}

    对于任何包含 的行test1,我们将变量设置f为 false (0)。

    当我们处于要打印的行范围内时,f将设置为 false。

  • !f{print}

    如果f为 false,则打印当前行。

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

    对于任何包含 的行test1/end,设置f为 true (1)。

    这表明我们不应该打印后面的行,直到到达包含 的行test1

使用变量

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

相关内容