如何删除“/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