Localizando e excluindo linhas de todos os arquivos recursivamente

12

Eu consegui usar as ocorrências de uma palavra-chave usando

grep "KeyWord" . -r -n -i -I 

mas, as ocorrências da KeyWord são muito grandes. Eu só quero apagar todas as linhas que contêm essa palavra.

Eu procurei por aí, sed parece ser o utilitário. Alguém pode me dizer que comando faria o truque?

Obrigado.

    
por snihalani 06.07.2012 / 02:26

2 respostas

23

Com um GNU sed:

find . -type f -print0 | xargs -0 sed -i /KeyWord/d

Com um sed do OSX:

find . -type f -print0 | xargs -0 sed -i '' /KeyWord/d

O primeiro comando find encontra todos os arquivos padrão (não diretórios, ou pipes, etc.), os imprime separados por xargs (para que os nomes de arquivos possam conter espaços, novas linhas, etc.).

Segundo comando find lê a saída de -0 , pega uma lista baseada em um separador ( sed -i [...] por causa de sed ), chama sed com parâmetros adicionados da lista ( -i será chamado várias vezes se houver muitos arquivos, pois o comprimento máximo dos parâmetros é limitado em cada chamada).

O comando /KeyWord/d modifica no local ( KeyWord ).

Quanto a sed , ele excluirá as linhas que contêm a expressão regular zsh .

Você deve aprender %code% a entender corretamente a sintaxe (simples, mas incomum) e consultar as páginas de manual apropriadas para obter mais informações sobre as ferramentas envolvidas aqui.

E como gosto de promover %code% , a solução com seus globs estendidos:

sed -i /KeyWord/d **/*(.)
    
por 06.07.2012 / 02:32
1

Você pode usar o Vim no modo Ex:

find -type f -exec ex -sc g/KeyWord/d -cx {} ';'
  1. g pesquisa global

  2. d delete

  3. x salvar e fechar

por 16.04.2016 / 23:56

Tags