Linux
如果關鍵字 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
嘗試:
$ 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