SED supprimer uniquement la ligne concernée

Bonjour,

Je dispose d’un fichier texte composé d’adresses mails :

Maintenant je veux supprimer uniquement la ligne “seb@1test.local” ainsi que tout ce qui précède cette adresse.

Si j’utilise le sed ci-dessous, il me supprime tout :

email="seb@1test.local"
/bin/sed -i '/'"${email}"'/d' /home/liste.txt

Le résultat dans le fichier sera :

au lieu de :

Une petite idée afin de supprimer uniquement la ligne commençant pas l’adresse ?

Merci :006

#!/bin/sh mail='seb@1test.local' awk "1;/${mail}/{exit}" "$1" > "$1.new" mv "$1.new" "$1"
Comme ça ?

Bonjour MisterFreez,

Merci pour l’aide !

A quoi correspond le “{exit}” ?

J’ai répondu vite c’est assez cryptique…
[mono]“1;/${mail}/{exit}”[/mono] est remplacé par le shell par [mono]“1;/seb@1test.local/{exit}”[/mono].
Ensuite on découpe sur le [mono];[/mono] pour voir chaque commande awk.

1; /seb@1test.local/ { exit }
Le 1 est une condition toujours vraie (0 est faux et tout ce qui n’est pas 0 est vrai c’est hérité du C).
Quand une condition n’est pas suivie d’un bloque de code [mono]{}[/mono], par défaut le bloque de code est [mono]{print}[/mono] et [mono]print[/mono] prend par défaut [mono]$0[/mono] comme argument. [mono]$0[/mono] est une variable de awk qui représente la ligne entière.
Donc ici, [mono]1;[/mono] ça recopie tout ([mono]awk ‘1’ fichier[/mono] est équivalent à [mono]cat fichier[/mono]).

Le second c’est une condition [mono]/seb@1test.local/[/mono] qui est une contraction de [mono]$0 ~ /seb@1test.local/[/mono] et qui signifie « si on trouve l’expression régulière [mono]seb@1test.local[/mono] dans la ligne ([mono]$0[/mono]) ». Et le bloc de code qui est exécuté c’est [mono]exit[/mono] pour arrêter awk.

Donc ça donne :
Pour chaque ligne :
[ul][li] on écris la ligne[/li]
[li] si la ligne que l’on vient d’écrire contient « seb@1test.local »
[list] [] on s’arrête[/li][/ul][/:m][/list:u]

Ok merci pour l’explication…

Par contre Est-ce que cela va fonctionner car “seb@1test.local” est présent deux fois, or je cherche uniquement à supprimer la ligne 3 et non pas la 2.

[quote]untest@domaine.net untest1@domaine.net
seb@1test.local
other@fai.com[/quote]

Non. Qu’est ce que tu cherche à supprimer ? Tout à partir du dernier ou du deuxième ? (imagine qu’il y a en a 3)
Si c’est à partir du dernier :

#!/bin/sh mail='seb@1test.local' tac "$1" | awk "cpy=1;/${mail}/{cpy=1}" | tac > "$1.new" mv "$1.new" "$1"
Ça ça devrait fonctionner (je golfe un peu awk pourrait tout faire tout seul, mais c’est moins concis).

Je cherche à supprimer la ligne qui commence par “seb@1test.local”.

Sachant qu’une ligne ne peut pas commencer X fois par la même adresse, par contre cette adresse peut être présente plusieurs fois dans le fichier mais pas en début de ligne…

Suis-je clair ? :083

En premier, quelque chose comme ça :
[mono]sed -i~ ‘/^seb@1test.local:/,$d’ /chemin du fichier[/mono]

C’est Michel qui m’avait appris ça.

Oui est du coup c’est simple :

#!/bin/sh mail='seb@1test.local' awk "1;/^${mail}/{exit}" "$1" > "$1.new" # le ^ fait qu'on cherche la ligne qui commande par cette adresse mv "$1.new" "$1"
Mais du coup on peut faire plus propre (mais plus long) :

#!/bin/sh mail='seb@1test.local' awk -v mail="$mail" "1;$1==mail{exit}" "$1" > "$1.new" # le ^ fait qu'on cherche la ligne qui commande par cette adresse mv "$1.new" "$1"
Là la condition c’est que le premier mot de la ligne correspond à l’adresse (et du coup on peut utiliser une variable :slightly_smiling: ).

@ricardo > C’est ce que je lui aurait proposé s’il cherchait à supprimer uniquement cette ligne mais il veut supprimer toutes les lignes qui suivent.

@ricardo > C’est ce que je lui aurait proposé s’il cherchait à supprimer uniquement cette ligne mais il veut supprimer toutes les lignes qui suivent.[/quote]
Heu non !!

Dans le fichier suivant je veux sortir la ligne qui commence par “seb@1test.local” donc “seb@1test.local other@fai.com” doit disparaitre du fichier et strictement rien de plus :115

Donc :

Ah ! Alors oui commande de ricardo.

Merci à vous deux :041

Tu peux dire à Michel seulement, moi je n’ai fait que répéter ce qu’il m’avait appris pour ce même genre de requête, que j’utilise assez souvent pour de petits scripts.
C’est un crack en prog et en França…heu ! un peu moins pour le second :laughing: :laughing: :laughing:

J’arrive après le déluge mais «grep -v -E “^seb@1test.local” fichier» ne fait il pas ce qui est demandé ou j’ai raté un truc?

Si mais l’intérêt de sed c’est l’option [mono]-i[/mono] (elle devrait inspirer d’autres programmes comme awk et grep).

Bonsoir,

Que veut dire le ~ après le i ?

sed -i~

Ça permet de créer un fichier de backup avec le suffixe « ~ ».

Ha oui :030 !!

Merci :wink: