Como deletar uma linha específica e a seguinte linha em branco usando o GNU sed?

3

Eu tenho o seguinte texto:

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

Gostaria de excluir as linhas que começam com "Data de início" e a seguinte linha em branco. Em outras palavras, gostaria de ter apenas:

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

Espero que minha pergunta não seja uma cópia de Remover linha contendo determinada string e a seguinte linha

    
por Community 11.11.2013 / 14:41

3 respostas

6
sed '/^Start-Date:/ {N; /\n$/d}'

Sed é um editor de stream, faz slurp / identifique gaggles de linha e faça o que quiser com eles.

N é "anexar uma nova linha e a próxima linha de entrada ao buffer atual", portanto \n no buffer é o início de uma linha anexada /\n$/d significa "se a última linha anexada no buffer for vazio basta soltar tudo isso ".

    
por 11.11.2013 / 17:52
1

awk poderia ajudar:

$ 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
    
por 11.11.2013 / 15:19
0

Em Perl:

$ 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

Ou para remover linhas em branco:

$ 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

A opção -n faz com que perl processe um arquivo de entrada linha a linha, salvando cada linha na variável especial $_ . O scriptlet acima imprime a linha atual ( $_ ) e a linha anterior ( $last ) se a atual começar com Commandline . Em seguida, ele salva a linha atual como $last e passa para a próxima linha.

    
por 11.11.2013 / 16:03

Tags