Encontrar e excluir linhas de todos os arquivos recursivamente

12

Eu consegui grep 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 o que o comando faria o truque?

Obrigado.

snihalani
fonte

Respostas:

23

Com um sed GNU:

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

Primeiro comando find encontra todos os arquivos padrão (não diretórios, canos ou etc.), imprime-os separados por \0 (assim, os nomes de arquivos podem conter espaços, novas linhas, etc.).

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

o sed comando modifica in-loco ( -i ).

Quanto a /KeyWord/d, ele irá deletar linhas contendo a expressão regular KeyWord.

Você deveria aprender sed para entender adequadamente a sintaxe (simples, mas incomum) e consulte as páginas de manual apropriadas para obter mais informações sobre as ferramentas envolvidas aqui.


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

sed -i /KeyWord/d **/*(.)
Pierre Carrier
fonte
Que tal simplesmente deletar a palavra "keyword"? e não a linha inteira?
snihalani
s/KeyWord//g (substitutos KeyWord com '' (string vazia), g para todos (não apenas o primeiro em cada linha).
Pierre Carrier
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 excluir

  3. x salvar e fechar

Steven Penny
fonte
no OSX que me deu find: illegal option -- t , teve que adicionar o . find . -type f -exec ex -sc g/KeyWord/d -cx {} ';'
Erik