#1 Le 28/06/2017, à 14:40
- Gowser
Supprimer une ligne avec un motif précis
Bonjour;
Ma question a peut-être déjà été posée mais si c'est le cas, je n'ai pas utilisé les bons mots pour la recherche.
Dans un script bash, j'utilise sed pour supprimer des lignes avec un pattern mais le souci est que sed fait trop bien le travail. Par exemple, j'ai un fichier avec :
toto
tatatoto
tototutu
Je lance la commande sed -i '/toto/d' fichier et sed me supprime toutes les lignes y compris celles tototutu et tatatoto (ce qui est normal) hors je souhaiterais ne supprimer que la ligne toto. Je n'ai pas réussi à trouver comment supprimer seulement quand on trouve toto seul.
Je n'ai pas d'actions chez sed donc je peux passer par une autre commande pour réaliser cette action.
Si quelqu'un a une piste, une solution, je suis preneur.
Cordialement.
Dernière modification par Gowser (Le 28/06/2017, à 14:40)
Hors ligne
#2 Le 28/06/2017, à 14:54
- DonutMan75
Re : Supprimer une ligne avec un motif précis
Hello,
je suggère :
$ sed -re '/^toto$/d'
^ indique un début de ligne
$ une fin de ligne
Ainsi ni tatatoto ni tototutu ne "matchent".
Donut
Dernière modification par DonutMan75 (Le 28/06/2017, à 15:54)
Hors ligne
#3 Le 28/06/2017, à 15:40
- Gowser
Re : Supprimer une ligne avec un motif précis
Merci pour la suggestion, j'ai remplacé ma ligne par sed -i '/'^$variable$'/d' fichier et effectivement, y'a un mieux.
En effet, je conserve tatatoto mais en revanche, ça me supprime toujours tototutu. J'avais au départ testé avec ^$variable^ mais le résultat n'était pas concluant.
Hors ligne
#4 Le 28/06/2017, à 15:57
- DonutMan75
Re : Supprimer une ligne avec un motif précis
Hello,
pourrais-tu donner un exemple précis (avec les balises code) ?
Essaies de bien vérifier ta syntaxe + les options de sed.
En effet, chez moi ça marche nickel :
$ cat test.txt
toto
tatatoto
tototutu
$ cat test.txt | sed -re '/^toto$/d'
tatatoto
tototutu
Si on utilise une variable (comme tu sembles le faire dans ton dernier message) :
$ PATTERN='toto'
$ echo $PATTERN
toto
$ cat test.txt | sed -re "/^${PATTERN}$/d"
tatatoto
tototutu
Si enfin, on demande à sed de modifier le fichier (option -i) :
$ sed -rie '/^toto$/d' test.txt
$ cat test.txt
tatatoto
tototutu
Dernière modification par DonutMan75 (Le 28/06/2017, à 15:59)
Hors ligne
#5 Le 28/06/2017, à 16:39
- Hizoka
Re : Supprimer une ligne avec un motif précis
Salut, la réponse de DonutMan75 répond à ta question.
Si le résultat ne te va pas, c'est que la question était incomplète
DonutMan75, pourquoi utiliser des cat et des pipe inutiles ?!
sed ..... test.txt
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#6 Le 28/06/2017, à 16:45
- DonutMan75
Re : Supprimer une ligne avec un motif précis
Hizoka, oui je sais bien c'est une manie contre laquelle je tente de lutter depuis des années (les cat inutiles) ^^
Hors ligne
#7 Le 29/06/2017, à 09:46
- Gowser
Re : Supprimer une ligne avec un motif précis
Bonjour,
Merci pour vos réponses, j'ai bien testé sed -rie "/^${variable}$/d" $fichier et il ne fait rien (pas de suppression).
Hors ligne
#8 Le 29/06/2017, à 10:53
- pingouinux
Re : Supprimer une ligne avec un motif précis
Bonjour,
j'ai bien testé sed -rie "/^${variable}$/d" $fichier et il ne fait rien (pas de suppression).
Cette commande est correcte si toto est seul sur sa ligne (sans espace ni avant ni après). Fais un copier-coller (entre balises-code) des commandes que tu as lancées et de leur retour.
Ajouté : Pour vérifier le type du fichier texte, quel est le retour de
file "$fichier"
Dernière modification par pingouinux (Le 29/06/2017, à 10:58)
Hors ligne
#9 Le 29/06/2017, à 11:23
- Gowser
Re : Supprimer une ligne avec un motif précis
En réalité, toto ne sera pas seul sur la ligne, l'objectif est de modifier un fichier dns (sous bind) donc l'enregistrement sera sous la forme :
toto IN A @IP
tototata IN A @IP
Hors ligne
#10 Le 29/06/2017, à 11:30
- pingouinux
Re : Supprimer une ligne avec un motif précis
Dans ce cas
sed -i "/\<${variable}\>/d" "$fichier"
Ajouté :
Ou bien
sed -i "/\b${variable}\b/d" "$fichier"
Dernière modification par pingouinux (Le 29/06/2017, à 12:15)
Hors ligne
#11 Le 29/06/2017, à 12:48
- Gowser
Re : Supprimer une ligne avec un motif précis
Je vais tester ça merci
Edit : testé et approuvé, un grand merci.
Edit 2 : ça fonctionne aussi très bien avec grep.
Dernière modification par Gowser (Le 29/06/2017, à 13:20)
Hors ligne
#12 Le 29/06/2017, à 16:22
- Hizoka
Re : Supprimer une ligne avec un motif précis
Le problème venait donc bien de l’énoncer et non de la réponse
grep ne peut pas modifier ton fichier en direct contrairement à sed (je ne sais pas si c'est ce que tu veux...).
pingouinux : Merci pour le coup des < > que j'avais complètement oublié mais qui est bien pratique
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne