我有一個包含以下內容的文件,
Hello world Unix!!
Its bright world
Current time is HH:mm:ss
Next action plan is item #3
End of task.
Thank you.
Hello world Linux!!
All actions completed.
End of Activity.
Thanks.
我想選擇性地刪除包含關鍵字“world”的所有行以及所有後續行,直到遇到包含特定關鍵字集(例如“Activity”或“task”)的行。
期望的輸出:
End of task.
Thank you.
End of Activity.
Thanks.
答案1
嘗試:
$ awk -v f=1 '/world/{f=0} /Activity|task/{f=1} f' File
End of task.
Thank you.
End of Activity.
Thanks.
怎麼運作的:
-v f=1
建立一個 awk 變數
f
並將其設定為1
./world/{f=0}
如果目前行包含
world
,則將變數設為f
零。/Activity|task/{f=1}
如果該行包含
Activity
或task
,則設定f
為1
。請注意,
world
上面和Activity
或task
這裡被視為正規表示式。此外,它們區分大小寫。f
如果
f
非零,則列印該行。
同時刪除空白行
$ awk -v f=1 '/world/{f=0} /Activity|task/{f=1} f && /./' File
End of task.
Thank you.
End of Activity.
Thanks.
f && /./
f
告訴 awk 僅在非零時列印該行和該行至少包含一個字元(任何類型)。
答案2
不像 awk 解決方案那麼漂亮,但由於 OP 標記了問題sed同樣,這裡是:
#with blank lines
sed '/world/,/task\|Activity/{//!d};/world/d' file
#without blank lines
sed '/world/,/task\|Activity/{//!d};/world\|^$/d' file
請注意 的使用//
,這意味著先前使用的正規表示式:)