delete da nth ocorrência para o final do arquivo

4

Como você exclui da enésima ocorrência de um padrão ao fim do arquivo usando ferramentas de linha de comando como sed ?
por exemplo. exclua do terceiro foo no seguinte:

something
foo1
maybe something else
foo2
maybe not
foo3 -this line and anything after is gone- 
I'm not here

$sed '/magic/'

Resultado desejado:

something
foo1
maybe something else
foo2
maybe not

Pontos de bônus para a mesma coisa, mas mantendo a linha contendo o terceiro foo .

    
por JB0x2D1 30.07.2016 / 19:50

3 respostas

7

Sem manter a linha:

awk -v n=3 '/foo/{n--}; n > 0'

Mantendo a linha:

awk -v n=3 'n > 0; /foo/{n--}'

Embora possamos melhorar um pouco para que paremos e paremos de ler assim que encontrarmos o terceiro foo :

awk -v n=3 '/foo/{n--; if (!n) exit}; {print}' # not-keep
awk -v n=3 '{print}; /foo/{n--; if (!n) exit}' # keep

sed seria mais complicado. Você precisaria manter a contagem de ocorrências foo como um número de caracteres no espaço de espera como:

Guarde:

sed '
  /foo/{
    x;s/^/x/
    /x\{3\}/{
      x;q
    }
    x
  }'

Não manter:

sed -ne '/foo/{x;s/^/x/;/x\{3\}/q;x;}' -e p
    
por 30.07.2016 / 19:53
2

Se você aceitar perl como uma ferramenta de linha de comando , também poderá

perl -ne 'print unless $c>2; ++$c if /foo/' 
perl -ne '++$c if /foo/; print unless $c>2' 

com / sem manter.

    
por 30.07.2016 / 21:11
1

Resposta alternativa: você pode fazer isso a partir do vim. Você poderia fazer isso com o vim como um editor de texto ou como uma ferramenta de linha de comando. Como editor de texto (com e sem a linha):

/foo<cr>2ndG:wq<cr>
/foo<cr>2njdG:wq<cr>

Alguns detalhes importantes: <cr> significa "entrar". Além disso, você deve, em geral, fazer <n-1>ndG para excluir após a ocorrência de "N'th". Você pediu 3, então eu escrevi 2 no exemplo.

Você também pode fazer isso apenas a partir da linha de comando.

vim -c "/foo" -c "normal 2ndG" -c "wq"
vim -c "/foo" -c "normal 2njdG" -c "wq"

Essa abordagem também funcionará com expressões regulares. Este site fornece uma boa explicação do sabor vim da regex.

    
por 31.07.2016 / 04:45