Exclui o número desconhecido de linhas de * até a linha em branco

1

Eu tenho usado este fórum, então eu acabei de entrar! Eu tenho visto perguntas semelhantes, mas nada funcionou até agora (principalmente usando sed). Eu quero encontrar cada instância de um asterisco (*) em um arquivo e excluí-lo e tudo depois até que uma linha em branco seja atingida. Por exemplo:

*252
253
254
255
(blank line here)

OR

*261
265
(blank line here)

Cada bloco de dados irá variar em tamanho. Então eu quero ter saída para um novo arquivo. Alguma idéia?

    
por 985ranch 17.08.2016 / 00:14

1 resposta

3

Para excluir de uma linha que contém * para a próxima linha vazia, use:

sed '/[*]/,/^$/d' filename

Notas:

  1. Como * é um caractere regex ativo e queremos corresponder apenas a um literal * , precisamos escapar do * . Isso pode ser feito como \* ou, como mostrado acima, [*] .

  2. Para corresponder a uma linha vazia, precisamos de uma linha sem caracteres entre o início, denotada ^ e seu final, denotada $ . Assim, ^$ corresponde a uma linha vazia.

  3. /[*]/,/^$/ é um intervalo: corresponde a um grupo de linhas que começam com uma linha que contém * e terminam com uma linha vazia.

  4. d informa ao sed para excluir qualquer linha no intervalo.

O acima produz saída para stdout. Para alterar um arquivo, use:

sed -i.bak '/[*]/,/^$/d' filename

Exemplo

Considere este arquivo de amostra:

$ cat filename
*252
253
254
255

OR
*261
265

end

Isso produz:

$ sed '/[*]/,/^$/d' filename
OR
end
    
por 17.08.2016 / 00:38

Tags