4 votes

Suppression des lignes contenant une variable

J'ai un fichier texte qui contient des noms. J'aimerais que mon programme puisse supprimer les noms que je lui demande de supprimer.

D'abord, j'ai découvert que je pouvais le faire avec sed mais ça ne marche pas pour moi.

deletename est ma variable qui contiendra le modèle que je veux utiliser pour la recherche, et test.txt est mon fichier texte.

J'utilise :

deletename=0; read deletename; sed...

J'ai essayé :

sed "/$deletename/ d" test.txt
sed "/$deletename/d" test.txt
sed '/$deletename/ d' test.txt
sed '/$deletename/d' test.txt    
sed -e "/$deletename/ d" test.txt    
sed -e "/$deletename/d" test.txt
sed -e '/$deletename/ d' test.txt
sed -e '/$deletename/d' test.txt
sed -r "/$deletename/ d" test.txt
sed -r "/$deletename/d" test.txt
sed -r '/$deletename/ d' test.txt
sed -r '/$deletename/d' test.txt

Comme rien ne fonctionnait, j'ai eu l'idée de vérifier le numéro de la ligne qui contient le motif et de supprimer cette ligne. Je sais que je devrais utiliser grep mais je n'ai absolument aucune idée de la façon dont je dois l'utiliser.

J'ai essayé quelque chose comme ça, mais ça n'a pas marché :

lineno=`expr grep -n $deletename test.txt`

Quelqu'un peut-il m'aider ? Avec sed o grep n'a pas vraiment d'importance pour moi.

4voto

Zanna Points 65764

Si vous voulez utiliser read pour passer les noms, et vous voulez supprimer les lignes qui contiennent les noms :

read deletename; sed "/$deletename/d" test.txt

puis appuyez sur enter y read attend que vous entriez quelque chose, alors tapez ce que vous voulez deletename à être, par exemple 0 puis appuyez sur enter à nouveau et le sed est exécutée. Le contenu de test.txt apparaîtra dans le terminal, mais toutes les lignes qui contiennent 0 ou ce que vous avez tapé sera supprimé du flux (PAS du fichier).

Si vous voulez seulement supprimer les noms eux-mêmes, c'est comme ça :

read deletename; sed "s/$deletename//g" test.txt

Si vous tapez ensuite 0 alors chaque instance de 0 sera supprimé.

Vous pouvez rediriger (ou tee ) la sortie vers un nouveau fichier, ou si vous voulez modifier le fichier en place utilisez le -i drapeau (après test)

read deletename; sed -i "/$deletename/d" test.txt

Dans ce cas, vous ne verrez aucune sortie ; les modifications seront écrites dans le fichier au lieu d'être affichées dans le terminal (sur STDOUT).

Vous devez utiliser des guillemets doubles pour permettre l'expansion des paramètres, car les guillemets simples la supprimeront. Mais la manière la plus correcte, je pense, bien que non nécessaire dans ce cas simple, est d'utiliser des guillemets simples autour des autres parties de l'expression et de citer la variable normalement :

sed 's/'"$deletename"'//g' test.txt

2voto

Jim Points 53

Le filtrage des lignes est le rôle principal de grep . Utilisez -v pour inverser la correspondance, c'est-à-dire ne montrer que les lignes qui ne contiennent pas de texte. Vous pouvez donc utiliser la commande suivante :

read deletename; grep -v $deletename test.txt

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X