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.
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
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