Comment supprimer des lignes d'un fichier contenant une chaîne spécifique?

5

Comment supprimer des lignes d’un fichier (hosts) contenant une chaîne "adf.ly"?

    
posée wb9688 16.06.2015 - 10:13
la source

6 réponses

11

en utilisant sed

Exécutez cette commande:

sed -i '/adf\.ly/d' inputfile 

man sed

   -i[SUFFIX], --in-place[=SUFFIX]
      edit files in place (makes backup if extension supplied)

Utilisation de grep

Merci pour les notes @kos:

grep -v "ad\.fly" inputFile  > outputfile
    
réponse donnée Maythux 16.06.2015 - 10:23
la source
3

Utiliser awk (merci à terdon pour la version raccourcie):

< inputfile awk '!/adf\.ly/' > outputfile
  • < inputfile : redirige le contenu de inputfile vers awk 's stdin
  • > outputfile : redirige le contenu de awk 's stdout à outputfile

Répartition des commandes awk :

  • !/adf\.ly/ : imprime l'enregistrement s'il ne correspond pas à adf\.ly regex

Utilisation de Perl (merci à terdon pour la version raccourcie):

< inputfile perl -ne '/adf\.ly/||print' > outputfile
  • -n : place une boucle while (<>) {[...]} autour du script
  • -e : lit le script à partir des arguments

Répartition des commandes Perl:

  • / : démarre le motif
  • adf\.ly : correspond à une chaîne adf\.ly
  • / arrête le motif
  • || : exécute la commande suivante uniquement si le modèle ne correspond pas à la ligne
  • print : imprime la ligne
réponse donnée kos 16.06.2015 - 11:32
la source
3

Ce qui suit va supprimer les lignes contenant "adf.ly" dans filename.txt in-place:

sed -i '/adf\.ly/d' filename.txt

Utilisez la commande ci-dessus sans -i pour le tester avant de supprimer des lignes.

    
réponse donnée Ron 16.06.2015 - 10:23
la source
1

Voici un one-liner de bash :

while IFS= read -r i; do [[ ! $i =~ .*adf\.ly.* ]] && echo "$i"; done <file.txt
  • La variable i contiendra chaque ligne lors de l’itération

  • [[ $i =~ .*adf\.ly.* ]] vérifie si la ligne a la chaîne adf.ly , ! annule la vérification afin que [[ ! $i =~ .*adf\.ly.* ]] vérifie si la ligne ne contient pas adf.ly

  • Si oui ( && ), la ligne sera imprimée.

Pour enregistrer la sortie dans un autre fichier ( out.txt ):

while IFS= read -r i; do [[ ! $i =~ .*adf\.ly.* ]] && echo "$i"; done <file.txt >out.txt
    
réponse donnée heemayl 16.06.2015 - 14:27
la source
1

Vous pouvez utiliser l’éditeur de texte standard, ed :

printf '%s\n' 'g/adf\.ly/d' w q | ed file.txt
    
réponse donnée evilsoup 16.06.2015 - 19:46
la source
1

Vous pouvez utiliser Vim en mode Ex:

ex -sc 'g/adf\.ly/d' -cx hosts
  1. g recherche globale

  2. d delete

  3. x enregistrer et fermer

réponse donnée Steven Penny 16.04.2016 - 17:39
la source

Lire d'autres questions sur les étiquettes