Linux

如果關鍵字 2 不存在,則刪除關鍵字 1 之後的行

  • February 12, 2018

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

嘗試:

$ 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

引用自:https://unix.stackexchange.com/questions/423541