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

59

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

    
posée PersonX 07.10.2013 - 21:35
la source

5 réponses

80

Approche grep

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

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

L’option de mot entier s’assure qu’elle ne correspondra 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'option -E pour activer les expressions régulières étendues pour la syntaxe (one|other) .

Approche sed

Pour supprimer les lignes, vous pouvez également utiliser sed -i :

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

\b définit les limites des mots et l'opération d supprime la ligne correspondant à l'expression entre les barres obliques. cat et rat correspondent tous deux à la syntaxe (one|other) dont nous avons apparemment besoin pour é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 - Supprimer une ligne contenant une chaîne spécifique )

    
réponse donnée gertvdijk 07.10.2013 - 21:53
la source
12

Pour tester uniquement dans le terminal, utilisez:

sed '/[cr]at/d' file_name

Pour supprimer réellement ces lignes du fichier, utilisez:

sed -i '/[cr]at/d' file_name
    
réponse donnée Radu Rădeanu 07.10.2013 - 21:49
la source
5

Essayez le vim-way:

ex +"g/[cr]at/d" -scwq file.txt
    
réponse donnée kenorb 30.04.2015 - 00:26
la source
0

Considérez si vous avez un fichier avec file_name et que vous voulez rechercher la souris mais en même temps quelques lignes de souris ayant d'autres mots comme cat et rat et que vous ne voulez pas voir ceux de votre sortie, la seule façon de le faire est -

grep -r mouse file_name | grep -vE "(cat|rat)"
    
réponse donnée Indrajeet Gour 26.10.2015 - 12:33
la source
0

façon shell portable

Fonctionne dans /bin/sh , qui est dash sur Ubuntu, ainsi que ksh et bash . Un peu gênant que vous ayez à écrire plusieurs scénarios de test pour chaque mot dans case statement mais portable. Fonctionne avec 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(){
   #  is line read, prints to stdout
    case "" in
        cat|cat\ *|*\ cat\ *|*\ cat) true;; # do nothing if cat or rat in line
        rat|rat\ *|*\ rat\ *|*\ rat) true;; 
        *) printf "%s\n" ""
    esac
}

readlines(){
    #  is input file, the rest is words we want to remove
    inputfile=""
    shift

    while IFS= read -r line;
    do
        line_handler "$line" "[email protected]"
    done < "$inputfile"
    [ -n "$line" ] && line_handler "$line" 
}

readlines "[email protected]"

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
    
réponse donnée Sergiy Kolodyazhnyy 09.11.2017 - 04:58
la source

Lire d'autres questions sur les étiquettes