次のテキストがあります。
Start-Date: 2013-11-11 07:43:49
Commandline: apt-get install --no-install-recommends catfish
Start-Date: 2013-11-11 11:27:07
Start-Date: 2013-10-16 22:53:02
Start-Date: 2013-10-16 22:55:16
Start-Date: 2013-10-17 22:41:09
Start-Date: 2013-10-17 22:42:02
Start-Date: 2013-10-17 22:42:33
Start-Date: 2013-10-17 22:46:01
Start-Date: 2013-10-17 23:00:06
Commandline: apt-get install shimmer-themes
Start-Date: 2013-10-17 23:01:52
Commandline: apt-get install --no-install-recommends gedit
「開始日」で始まる行と次の空行を削除したいと思います。つまり、私はただ次のことをしたいと思います:
Start-Date: 2013-11-11 07:43:49
Commandline: apt-get install --no-install-recommends catfish
Start-Date: 2013-10-17 23:00:06
Commandline: apt-get install shimmer-themes
Start-Date: 2013-10-17 23:01:52
Commandline: apt-get install --no-install-recommends gedit
私の質問が重複していないことを願っています。特定の文字列を含む行と次の行を削除します。
答え1
sed '/^Start-Date:/ {N; /\n$/d}'
sedは、ライングループを吸収/認識し、目的の操作を実行するストリームエディタです。
N
「現在のバッファに改行と次の入力ラインを追加します」なので、バッファ\n
にあるのは追加されたラインの先頭です。/\n$/d
これは、「バッファに最後に追加された行が空の場合はすべて削除」を意味します。
答え2
awk
役に立つ:
$ awk '{if ($1=="Commandline:") {printf "%s\n%s\n\n", l,$0}; l=$0}' test.txt
Start-Date: 2013-11-11 07:43:49
Commandline: apt-get install --no-install-recommends catfish
Start-Date: 2013-10-17 23:00:06
Commandline: apt-get install shimmer-themes
Start-Date: 2013-10-17 23:01:52
Commandline: apt-get install --no-install-recommends gedit
答え3
パールでは:
$ perl -ne 'print $last,"$_\n" if /^Commandline/; $last=$_' foo.txt
Start-Date: 2013-11-11 07:43:49
Commandline: apt-get install --no-install-recommends catfish
Start-Date: 2013-10-17 23:00:06
Commandline: apt-get install shimmer-themes
Start-Date: 2013-10-17 23:01:52
Commandline: apt-get install --no-install-recommends gedit
または空白行を削除します。
$ perl -ne 'print $last,$_ if /^Commandline/; $last=$_' foo
Start-Date: 2013-11-11 07:43:49
Commandline: apt-get install --no-install-recommends catfish
Start-Date: 2013-10-17 23:00:06
Commandline: apt-get install shimmer-themes
Start-Date: 2013-10-17 23:01:52
Commandline: apt-get install --no-install-recommends gedit
この-n
スイッチを使用すると、perl
入力ファイルが1行ずつ処理され、各行が特殊変数に保存されます$_
。上記のスクリプトは、現在の行($_
)と現在の行がで始まる場合は前の行()を印刷します。次に、現在の行を別の名前で保存し、次の行に移動します。$last
Commandline
$last