89 votes

Comment supprimer les lignes du fichier texte contenant des mots spécifiques via le terminal ?

Comment supprimer toutes les lignes du fichier texte contenant les mots "chat" et "rat" ?

133voto

RN. Points 559

grep approche

Pour créer une copie du fichier sans les lignes correspondant à "cat" ou "rat", on peut utiliser grep en sens inverse ( -v ) et avec l'option mot entier ( -w ).

grep -vwE "(cat|rat)" sourcefile > destinationfile

L'option du mot entier permet de s'assurer qu'il n'y aura pas de correspondance cats o grateful par exemple. La redirection de sortie de votre Shell est utilisée ( > ) pour l'écrire dans un nouveau fichier. Nous avons besoin du -E pour activer les expressions régulières étendues pour les (one|other) la syntaxe.

sed approche

Alternativement, pour supprimer les lignes en place, on peut utiliser sed -i :

sed -i "/\b\(cat\|rat\)\b/d" filename

El \b fixe les limites des mots et le d supprime la ligne correspondant à l'expression entre les barres obliques. cat y rat sont toutes deux appariées par le (one|other) syntaxe que nous devons apparemment échapper avec des backslashes.

Conseil : utilisez sed sans le -i pour tester la sortie de la commande avant d'écraser le fichier.

(Basé sur Sed - Supprimer une ligne contenant une chaîne spécifique )

20voto

Radu Rădeanu Points 156862

Pour tester dans le terminal seulement, utilisez :

sed '/[cr]at/d' file_name

Pour vraiment supprimer ces lignes du fichier, utilisez :

sed -i '/[cr]at/d' file_name

6voto

kenorb Points 8840

Essayez d'utiliser ex (qui fait partie de Vi/Vim) :

ex +"g/[cr]at/d" -scwq file.txt

Ce qui précède présente un avantage par rapport à d'autres outils tels que sed en raison de son FreeBSD non standard -i extension (en place) et peut ne pas être disponible sur d'autres systèmes d'exploitation. Deuxièmement sed est un S tream ED itor, pas un éditeur de fichiers .

1voto

bac0n Points 4841

Utilisation de l'awk pour exclure les lignes contenant des mots spécifiques :

$ awk '!/\<(cat|rat)\>/{print $0}' ./input.txt

syntaxe awk :

  • !/regex/ N'imprime que les lignes qui ne correspondent pas à l'expression rationnelle.
  • | Opérateur d'alternance, utilisé pour spécifier des alternatives.
  • (...) Regroupement, par exemple regroupement d'opérateurs d'alternance.
  • \< Correspond à la chaîne vide au début d'un mot.
  • \> Correspond à la chaîne vide à la fin d'un mot.
  • {...} Déclaration d'action.

1voto

djperalta Points 11

Supprimer les lignes de tous les fichiers qui correspondent à la correspondance

grep -rl 'text_to_search' . | xargs sed -i '/text_to_search/d'

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X