Recherche et suppression récursives de lignes de tous les fichiers

14

J'ai réussi à saisir les occurrences d'un mot clé en utilisant

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

mais les occurrences du mot clé sont trop importantes. Je veux juste supprimer toutes les lignes contenant ce mot.

J'ai cherché autour de moi, sed semble être l'utilitaire. Quelqu'un peut-il me dire quelle commande ferait l'affaire?

Merci.

SurenNihalani
la source

Réponses:

25

Avec un sed GNU:

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

Avec un sed OSX:

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

La première commande findrecherche tous les fichiers standard (pas les répertoires, les canaux ou etc.), les imprime séparés par \0(afin que les noms de fichiers puissent contenir des espaces, des nouvelles lignes, etc.).

La deuxième commande xargslit la sortie de find, récupère une liste basée sur un séparateur (à \0cause de -0), appelle sed -i [...]avec des paramètres ajoutés à partir de la liste ( sedsera appelée plusieurs fois s'il y a beaucoup de fichiers, car la longueur maximale des paramètres est limitée dans chaque invocation).

La sedcommande modifie in-place ( -i).

Quant à /KeyWord/d, il supprimera les lignes contenant l'expression régulière KeyWord.

Vous devez apprendre sedà bien comprendre la syntaxe (simple mais inhabituelle) et vous référer aux pages de manuel appropriées pour plus d'informations sur les outils impliqués ici.


Et comme j'aime promouvoir zsh, la solution avec ses globes étendus:

sed -i /KeyWord/d **/*(.)
Pierre Carrier
la source
Que diriez-vous simplement de supprimer le mot "mot clé". et pas toute la ligne?
SurenNihalani
s/KeyWord//g(remplace KeyWordpar '' (chaîne vide), gpour tous (pas seulement le premier sur chaque ligne).
Pierre Carrier
1

Vous pouvez utiliser Vim en mode Ex:

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

  2. d supprimer

  3. x sauver et fermer

Steven Penny
la source
dans OSX qui m'a donné find: illegal option -- t, a dû ajouter le. find . -type f -exec ex -sc g/KeyWord/d -cx {} ';'
Erik