選擇性刪除兩個模式之間的線條

選擇性刪除兩個模式之間的線條

我有一個包含以下內容的文件,

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.

怎麼運作的:

  1. -v f=1

    建立一個 awk 變數f並將其設定為1.

  2. /world/{f=0}

    如果目前行包含world,則將變數設為f零。

  3. /Activity|task/{f=1}

    如果該行包含Activitytask,則設定f1

    請注意,world上面和Activitytask這裡被視為正規表示式。此外,它們區分大小寫。

  4. 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

請注意 的使用//,這意味著先前使用的正規表示式:)

相關內容