Remover linhas que não contenham uma palavra no Vim [duplicado]

1

No Vim, muitas vezes acho que estou interessado apenas em linhas que contêm uma certa seqüência de texto e quero excluir todas as outras linhas.

É fácil combinar linhas que contenham uma string:

:s/^.*foo.*\n//

O que eu normalmente acabo fazendo é dois passes, um para "marcar" todas as linhas que eu quero com um primeiro caracter especial:

:s/^\(.*foo.*\)$/X/

E na segunda passagem é fácil fazer uma correspondência negativa para um personagem em uma posição fixa, então eu apago todas as linhas sem minha string:

:s/^[^X].*\n//

Mas não há uma maneira muito mais simples de fazer isso com apenas um único passe? O que estou perdendo?

    
por hippietrail 28.10.2012 / 13:54

2 respostas

8

Isso excluiria todas as linhas que não contiverem foo .

:g/^\(.*foo\)\@!.*$/d

Em vez disso, você também pode usar :v para reverter o sentido do padrão de pesquisa.

:v/\(foo\)/d

Você pode ler mais sobre a forma como :g e :v funcionam aqui .

E mais sobre definição de intervalos, uso de metacaracteres, etc. para pesquisar e substituir aqui .

    
por 28.10.2012 / 14:02
0

Bem, se o seu objetivo é apenas remover as linhas com o texto, isso pode ser feito facilmente com o awk da seguinte forma:

awk '/regex/{print}' filename

Significado awk irá atuar no nome do arquivo. Você pode canalizá-lo para um novo nome de arquivo ou o mesmo nome de arquivo, como este -

   awk '/regex/{print}' filename > filename.tmp && mv filename.tmp filename
    
por 28.10.2012 / 14:05