Como remover um número n de linhas de um arquivo usando o comando sed? [duplicado]

0

Eu quero remover um determinado número de linhas depois que o padrão especificado for correspondido.

Alguém pode me dizer como isso pode ser feito usando o comando sed ?

    
por user2720323 26.09.2013 / 11:58

2 respostas

4

sed -ne '/pattern/{n;n;n;n;d;}' -e p

Excluiria a linha correspondente ao padrão e 4 linhas depois disso.

Se você não quiser excluir a linha que corresponde ao próprio padrão:

sed -ne '/pattern/{p;n;n;n;n;d;}' -e p

Explicação: se a linha atual corresponder ao padrão , [p] rint it, então obtenha o [n] ext one, e [n] ext e [n] ext, e [n] ext e [d] é o cartão. Por causa do [d] iscard, o comando [p] rint não é executado nesse caso. É executado para todas as outras linhas. -n desativa a impressão automática (que imprime quase tudo) e, portanto, implica o uso de -e p , que garante que as linhas resultantes sejam impressas.

Exemplo:

$ seq 8 | sed -ne '/2/{p;n;n;n;n;d;}' -e p
1
2
7
8

Para poder especificar o número de linhas como um número, seria mais fácil com awk :

awk 'n>0 {n--;next}; /pattern/{n=4}; 1'

(note que em todas essas soluções, o padrão não é procurado nas linhas que estão sendo ignoradas).

    
por 26.09.2013 / 12:03
0

Dois passos, assumindo o bash. Assumindo 2 linhas a serem removidas após as linhas contendo "padrão". Nota: A linha que contém o padrão NÃO é removida, mas duas linhas depois disso são removidas.

Para remover N linhas, altere A2 - > AN nos argumentos do grep

grep -n -A2 pattern inputFile | grep -Ev pattern | sed 's/^\([0-9]*\)-.*//g' > linesToRemove

while read p; do sed -i "${p}d" inputFile; done < linesToRemove

Se você também quiser excluir a linha contendo o padrão, altere o comando grep para

grep -n -A2 pattern inputFile | sed 's/^\([0-9]*\)[-:].*//g' > linesToRemove

Explicação: O primeiro comando descobre números de linha de linhas a serem excluídas. O segundo comando exclui essas linhas uma após a outra. Use o link para saber mais ou apenas man grep

Se o seu sed não tiver a opção -i , leia o link

    
por 26.09.2013 / 12:26