Comment supprimer toutes les lignes du fichier texte contenant les mots "chat" et "rat"?
Comment supprimer toutes les lignes du fichier texte contenant les mots "chat" et "rat"?
Réponses:
grep
approchePour créer une copie du fichier sans lignes correspondant à "cat" ou "rat", on peut utiliser grep
reverse ( -v
) et avec l'option de mot entier ( -w
).
grep -vwE "(cat|rat)" sourcefile > destinationfile
L'option de mot entier s'assure qu'il ne correspond pas cats
ou grateful
par exemple. La redirection de sortie de votre shell est utilisée ( >
) pour l'écrire dans un nouveau fichier. Nous avons besoin de l' -E
option pour activer les expressions régulières étendues pour la (one|other)
syntaxe.
sed
approcheAlternativement, pour supprimer les lignes sur place, on peut utiliser sed -i
:
sed -i "/\b\(cat\|rat\)\b/d" filename
La \b
limite de mot est définie et l' d
opération supprime la ligne correspondant à l'expression entre les barres obliques. cat
et rat
sont tous deux mis en correspondance avec la (one|other)
syntaxe nous avons apparemment besoin d'échapper avec des barres obliques inverses.
Conseil: utilisez sed
sans -i
opérateur pour tester le résultat de la commande avant de remplacer le fichier.
(Basé sur Sed - Supprime une ligne contenant une chaîne spécifique )
Pour tester uniquement dans un terminal, utilisez:
sed '/[cr]at/d' file_name
Pour vraiment supprimer ces lignes du fichier, utilisez:
sed -i '/[cr]at/d' file_name
Déterminez si vous avez un fichier avec file_name
et que vous souhaitez rechercher la souris, mais en même temps, quelques lignes de la souris ayant des mots tels que cat
et rat
et vous ne souhaitez pas les voir dans votre sortie, la seule façon de le faire est de -
grep -r mouse file_name | grep -vE "(cat|rat)"
Fonctionne dans /bin/sh
, qui est dash
sur Ubuntu, ainsi que ksh
, et bash
. Légèrement gênant que vous deviez écrire plusieurs cas de test pour chaque mot de la case
déclaration, mais portable. Fonctionne dans les cas où le mot apparaît seul sur la ligne, au début, à la fin de la ligne ou au milieu de la ligne, et ignore où il pourrait faire partie d'un autre mot.
#!/bin/sh
line_handler(){
# $1 is line read, prints to stdout
case "$1" in
cat|cat\ *|*\ cat\ *|*\ cat) true;; # do nothing if cat or rat in line
rat|rat\ *|*\ rat\ *|*\ rat) true;;
*) printf "%s\n" "$1"
esac
}
readlines(){
# $1 is input file, the rest is words we want to remove
inputfile="$1"
shift
while IFS= read -r line;
do
line_handler "$line" "$@"
done < "$inputfile"
[ -n "$line" ] && line_handler "$line"
}
readlines "$@"
Et voici comment cela fonctionne:
$ cat input.txt
the big big fat cat
the cat who likes milk
jumped over gray rat
concat
this is catchy
rat
rational
irrational
$ ./dellines.sh input.txt
concat
this is catchy
rational
irrational