web-dev-qa-db-fra.com

Supprimer des lignes contenant une variable

J'ai un fichier texte qui contient des noms. J'aimerais que mon programme puisse supprimer les noms auxquels je le dis.

Premièrement, j'ai découvert que je pouvais le faire avec sed, mais cela ne fonctionne tout simplement pas pour moi.

deletename est ma variable qui contiendra le motif que je souhaite 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 de tout cela ne fonctionnait, j'ai eu une idée: vérifier le numéro de la ligne contenant le motif et supprimer cette ligne. Je sais que je devrais utiliser grep, mais je ne sais absolument pas comment l'utiliser.

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

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

Quelqu'un pourrait-il aider? Avec sed ou grep, cela ne compte pas vraiment pour moi.

4
znst

Si vous souhaitez utiliser read pour transmettre les noms et supprimer les lignes contenant ces noms:

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

puis appuyez enter et read attend que vous saisissiez quelque chose. Tapez donc ce que vous voulez deletename, par exemple 0, puis appuyez sur enter à nouveau et la commande sed est exécutée. Le contenu de test.txt apparaîtra dans le terminal, mais toutes les lignes contenant 0, ou quoi que vous ayez tapé, seront supprimées du flux (PAS du fichier).

Si vous souhaitez uniquement supprimer les noms eux-mêmes, procédez comme suit:

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

Si vous tapez ensuite 0, toutes les instances de 0 seront supprimées.

Vous pouvez rediriger (ou tee) la sortie vers un nouveau fichier, ou si vous souhaitez modifier le fichier en place, utilisez l'indicateur -i (après le 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’extension des paramètres, car les guillemets simples le suppriment. mais la manière la plus correcte, je pense, bien que non nécessaire dans ce cas simple, consiste à utiliser des guillemets simples autour des autres parties de l’expression et à citer la variable normalement:

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

Filtrer les lignes est le rôle principal de grep. Utilisez le commutateur -v pour inverser la correspondance, c’est-à-dire n’afficher que les lignes qui ne contiennent pas de texte. Vous pouvez donc utiliser la commande suivante:

read deletename; grep -v $deletename test.txt
3
Jim