Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 28/06/2017, à 15: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, à 15:40)

Hors ligne

#2 Le 28/06/2017, à 15: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, à 16:54)

Hors ligne

#3 Le 28/06/2017, à 16: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, à 16: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, à 16:59)

Hors ligne

#5 Le 28/06/2017, à 17: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 wink

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, à 17: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, à 10: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, à 11:53

pingouinux

Re : Supprimer une ligne avec un motif précis

Bonjour,

Gowser #7 a écrit :

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, à 11:58)

Hors ligne

#9 Le 29/06/2017, à 12: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, à 12: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, à 13:15)

Hors ligne

#11 Le 29/06/2017, à 13:48

Gowser

Re : Supprimer une ligne avec un motif précis

Je vais tester ça merci smile

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, à 14:20)

Hors ligne

#12 Le 29/06/2017, à 17: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 wink

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 smile


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne