web-dev-qa-db-fra.com

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

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

69
PersonX

grep approche

Pour créer une copie du fichier sans lignes correspondant à "cat" ou "rat", vous pouvez utiliser grep à l'envers (-v) et avec l'option mot entier (-w).

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

L'option de mot entier garantit par exemple qu'elle ne correspond pas à cats ou grateful. La redirection de sortie de votre shell est utilisée (>) pour l'écrire dans un nouveau fichier. Nous avons besoin de l'option -E pour activer les expressions régulières étendues pour la syntaxe (one|other).

sed approche

Sinon, pour supprimer les lignes sur place, vous pouvez utiliser sed -i:

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

\b définit les limites de Word et l'opération d supprime la ligne correspondant à l'expression entre les barres obliques. cat et rat sont tous deux mis en correspondance avec la syntaxe (one|other) que nous devons apparemment échapper avec des barres obliques inverses.

Conseil: utilisez sed sans l'opérateur -i pour tester la sortie de la commande avant de remplacer le fichier.

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

93
gertvdijk

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
15
Radu Rădeanu

Essayez le vim-way:

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

Considérez 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 contenant d'autres mots tels que cat et rat et que vous ne voulez pas voir celles-ci dans votre sortie. est -

grep -r mouse file_name | grep -vE "(cat|rat)"
0
Indrajeet Gour

manière Shell

Fonctionne dans /bin/sh, qui est dashsur Ubuntu, ainsi que kshet bashname__. C'est un peu gênant que vous deviez écrire plusieurs scénarios de test pour chaque mot dans une instruction casemais portable. Fonctionne avec les cas où Word 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 Word.

#!/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
0