Comment prendre une liste et la supprimer d'un fichier?

10

J'ai une longue liste de noms de domaine que je dois supprimer de / etc / remotedomains. Ils ne sont probablement pas dans un ordre particulier dans le fichier. Chaque domaine est sur une seule ligne.

Comment pourrais-je parcourir la liste et trouver cette ligne dans des domaines distants et la supprimer?

xénoterracide
la source

Réponses:

11
grep -Fxf list -v /etc/remotedomains > remotedomains.new
mv remotedomains.new /etc/remotedomains

Le -vdit à grep de ne sortir que les lignes qui ne correspondent pas au modèle.

Le -f listdit à grep de lire les modèles du fichier list.

Le -Fdit à grep d'interpréter les modèles comme des chaînes simples, pas des expressions régulières (donc vous n'aurez pas de problème avec les méta-caractères regex).

Le -xdit à grep de correspondre à la ligne entière, par exemple s'il y a un modèle fooqui ne devrait supprimer que la ligne foo, pas la ligne foobarou barfoo.

sepp2k
la source
3
Remarque: n'oubliez pas de sauvegarder /etc/localdomainset /etc/remotedomainsavant de faire des choses comme ça.
xenoterracide
3
-Fest pour une correspondance de chaîne fixe («correspondances exactes»), mais elle ne force pas le modèle à correspondre à la ligne entière. POSIX spécifie l' -xindicateur pour limiter les correspondances aux cas où un modèle correspond à la ligne entière.
Chris Johnsen
@Chris: Bah, bonne prise.
sepp2k
1

Utilisez comm!

comm -23 /etc/remotedomains remove

Depuis la page de manuel:

Comparez les fichiers triés FILE1 et FILE2 ligne par ligne.

Sans aucune option, produisez une sortie à trois colonnes. La première colonne contient des lignes propres à FILE1, la deuxième colonne contient des lignes uniques à FILE2 et la troisième colonne contient des lignes communes aux deux fichiers.

Les options -1, -2 et -3 désactivent les colonnes respectives.

Il nécessite cependant que les fichiers soient triés.

jgr
la source
0

sed -r -i -e '/^(domain1|domain2|domain3|...|domainN)$/d' domainlist.txt

Si votre liste de domaines à supprimer se trouve dans un fichier, alors:

sed -r -i -e '/^'"$(xargs <removelist.txt|sed -e 's/ /|/g)"')$/d' domainlist.txt

Remarques:

  1. Utilisez -i.bak pour que sed fasse une sauvegarde de domainlist.txt

  2. Si removelist.txt a plusieurs milliers d'entrées, il peut dépasser la longueur maximale de la ligne de commande. Ce n'est pas un scénario très probable, mais quelque chose que vous devez savoir.

Après réflexion, ce risque peut être éliminé avec:

for RE in $(xargs <removelist.txt|sed -e 's/ /|/g') ; \
  do sed -r -i -e '/^('"$RE"')$/d' domainlist.txt ; \
done
cas
la source