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


72

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


Cela ressemble étrangement à un devoir. N'oubliez pas d'attribuer votre réponse aux gentils gens chez Askubuntu.
Zwets

Cela fait partie du grand projet, je suis nouveau dans l'environnement Linux.
PersonX

Réponses:


100

grep approche

Pour créer une copie du fichier sans lignes correspondant à "cat" ou "rat", on peut utiliser grepreverse ( -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 catsou gratefulpar exemple. La redirection de sortie de votre shell est utilisée ( >) pour l'écrire dans un nouveau fichier. Nous avons besoin de l' -Eoption pour activer les expressions régulières étendues pour la (one|other)syntaxe.

sed approche

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

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

La \blimite de mot est définie et l' dopération supprime la ligne correspondant à l'expression entre les barres obliques. catet ratsont tous deux mis en correspondance avec la (one|other)syntaxe nous avons apparemment besoin d'échapper avec des barres obliques inverses.

Conseil: utilisez sedsans -iopé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 )


Je me demande s’il existe un moyen de supprimer à la fois le fichier source ET de générer le fichier avec des correspondances. Probablement pas, mais cela serait utile (par exemple, lorsque vous obtenez un fichier qui grossit trop, vous le divisez en fonction du contenu).
Sridhar Sarnobat

1
@ Sridhar-Sarnobat Oh, vous pouvez. Utilisez tee et subshells pour copier stdout. Dans l'un, vous filtrez, dans l'autre, l'inverse. Utilisation de tee et de sous-coquilles démontrée dans une cas d'utilisation non apparentée démontrée ici: blog.g3rt.nl/…
gertvdijk

15

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

5

Essayez le vim-way:

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

0

Déterminez si vous avez un fichier avec file_nameet que vous souhaitez rechercher la souris, mais en même temps, quelques lignes de la souris ayant des mots tels que catet ratet 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)"

0

manière de coque portable

Fonctionne dans /bin/sh, qui est dashsur Ubuntu, ainsi que ksh, et bash. Légèrement gênant que vous deviez écrire plusieurs cas de test pour chaque mot de la casedé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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.