
次の内容を含むファイルがあります。
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.
「アクティビティ」や「アクション」などの特定のキーワードセットを含む行が表示されるまで、「世界」というキーワードを含むすべての行とすべての後続の行を選択的に削除したいと思います。
希望の出力:
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
0に設定されます。/Activity|task/{f=1}
行に
Activity
またはが含まれている場合にtask
設定されます。f
1
world
上記Activity
および/またはtask
ここが正規表現で処理されることに注意してください。また、大文字と小文字を区別します。f
f
0以外の場合は、その行を印刷します。
空白行も削除してください
$ awk -v f=1 '/world/{f=0} /Activity|task/{f=1} f && /./' File
End of task.
Thank you.
End of Activity.
Thanks.
f && /./
f
0以外の場合にのみ行を印刷するようにawkに指示します。そして行には、すべての種類の文字が1つ以上含まれています。
答え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
//
使用する前に正規表現の使用に注意してください:)