# SED supprimer uniquement la ligne concernée

**URL:** <https://www.debian-fr.org/t/sed-supprimer-uniquement-la-ligne-concernee/61446>\
**Category:** Programmation\
**Created:** [Février 21, 2016, 7:59 UTC](https://www.debian-fr.org/t/sed-supprimer-uniquement-la-ligne-concernee/61446 "2016-02-21T19:59:05Z")\
**Posts on this page:** 18\
**Page:** 1

<div class="post-metadata">

**Author:** ![\_seb](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/_/90db22/32.png) [@\_seb](https://www.debian-fr.org/u/_seb)\
**Post date:** [Février 21, 2016, 7:59 UTC](https://www.debian-fr.org/t/sed-supprimer-uniquement-la-ligne-concernee/61446/1 "2016-02-21T19:59:05Z")

</div>

Bonjour,

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

> [@](#):
>
> [untest1@domaine.net](mailto:untest1@domaine.net)  
> [seb@1test.local](mailto:seb@1test.local)  
> [other@fai.com](mailto:other@fai.com)

Maintenant je veux supprimer uniquement la ligne «&nbsp;[seb@1test.local](mailto:seb@1test.local)&nbsp;» ainsi que tout ce qui précède cette adresse.

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

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

Le résultat dans le fichier sera :

> [@](#):
>
> [untest1@domaine.net](mailto:untest1@domaine.net)

au lieu de :

> [@](#):
>
> [untest1@domaine.net](mailto:untest1@domaine.net)  
> [seb@1test.local](mailto:seb@1test.local)

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

Merci ![:006](https://www.debian-fr.org/uploads/default/original/1X/924eb3db8bedad6a0d333b02031d3c6a9af9d9c5.gif "salut")

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 7:59 UTC](https://www.debian-fr.org/t/sed-supprimer-uniquement-la-ligne-concernee/61446/2 "2016-02-21T19:59:06Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![\_seb](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/_/90db22/32.png) [@\_seb](https://www.debian-fr.org/u/_seb)\
**Post date:** [Février 21, 2016, 7:59 UTC](https://www.debian-fr.org/t/sed-supprimer-uniquement-la-ligne-concernee/61446/3 "2016-02-21T19:59:06Z")

</div>

Bonjour MisterFreez,

Merci pour l’aide !

A quoi correspond le “{exit}” ?

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 7:59 UTC](https://www.debian-fr.org/t/sed-supprimer-uniquement-la-ligne-concernee/61446/4 "2016-02-21T19:59:06Z")

</div>

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]

---

<div class="post-metadata">

**Author:** ![\_seb](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/_/90db22/32.png) [@\_seb](https://www.debian-fr.org/u/_seb)\
**Post date:** [Février 21, 2016, 7:59 UTC](https://www.debian-fr.org/t/sed-supprimer-uniquement-la-ligne-concernee/61446/5 "2016-02-21T19:59:07Z")

</div>

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](mailto:untest1@domaine.net)  
[seb@1test.local](mailto:seb@1test.local)  
[other@fai.com](mailto:other@fai.com)[/quote]

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 7:59 UTC](https://www.debian-fr.org/t/sed-supprimer-uniquement-la-ligne-concernee/61446/6 "2016-02-21T19:59:07Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![\_seb](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/_/90db22/32.png) [@\_seb](https://www.debian-fr.org/u/_seb)\
**Post date:** [Février 21, 2016, 7:59 UTC](https://www.debian-fr.org/t/sed-supprimer-uniquement-la-ligne-concernee/61446/7 "2016-02-21T19:59:07Z")

</div>

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](https://www.debian-fr.org/uploads/default/original/1X/d14bbab5e0eb9167fe7ed1d009c5a9b723425957.gif "yeux-ciel")

---

<div class="post-metadata">

**Author:** ![ricardo](https://www.debian-fr.org/user_avatar/www.debian-fr.org/ricardo/32/3864_2.png) [@ricardo](https://www.debian-fr.org/u/ricardo)\
**Post date:** [Février 21, 2016, 7:59 UTC](https://www.debian-fr.org/t/sed-supprimer-uniquement-la-ligne-concernee/61446/8 "2016-02-21T19:59:07Z")

</div>

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.

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 7:59 UTC](https://www.debian-fr.org/t/sed-supprimer-uniquement-la-ligne-concernee/61446/9 "2016-02-21T19:59:08Z")

</div>

> [@\_seb\_](#):
>
> Suis-je clair ? ![:083](https://www.debian-fr.org/uploads/default/original/1X/d14bbab5e0eb9167fe7ed1d009c5a9b723425957.gif "yeux-ciel")

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

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

---

<div class="post-metadata">

**Author:** ![\_seb](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/_/90db22/32.png) [@\_seb](https://www.debian-fr.org/u/_seb)\
**Post date:** [Février 21, 2016, 7:59 UTC](https://www.debian-fr.org/t/sed-supprimer-uniquement-la-ligne-concernee/61446/10 "2016-02-21T19:59:08Z")

</div>

> [@MisterFreez](#):
>
> [quote=«&nbsp;_seb_&nbsp;»]Suis-je clair ? ![:083](https://www.debian-fr.org/uploads/default/original/1X/d14bbab5e0eb9167fe7ed1d009c5a9b723425957.gif "yeux-ciel")

@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 «&nbsp;[seb@1test.local](mailto:seb@1test.local)&nbsp;» donc «&nbsp;[seb@1test.local](mailto:seb@1test.local) [other@fai.com](mailto:other@fai.com)&nbsp;» doit disparaitre du fichier et strictement rien de plus ![:115](https://www.debian-fr.org/uploads/default/original/1X/f0b4ead290aa124671b5f77e5c5e1073057a630b.gif "eureka")

> [@](#):
>
> [untest1@domaine.net](mailto:untest1@domaine.net)  
> [seb@1test.local](mailto:seb@1test.local)  
> [other@fai.com](mailto:other@fai.com)  
> [dfdsfdsf@fdsfdsfdf.gt](mailto:dfdsfdsf@fdsfdsfdf.gt)

Donc :

> [@](#):
>
> [untest1@domaine.net](mailto:untest1@domaine.net)  
> [seb@1test.local](mailto:seb@1test.local)  
> [dfdsfdsf@fdsfdsfdf.gt](mailto:dfdsfdsf@fdsfdsfdf.gt)

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 7:59 UTC](https://www.debian-fr.org/t/sed-supprimer-uniquement-la-ligne-concernee/61446/11 "2016-02-21T19:59:08Z")

</div>

Ah ! Alors oui commande de ricardo.

---

<div class="post-metadata">

**Author:** ![\_seb](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/_/90db22/32.png) [@\_seb](https://www.debian-fr.org/u/_seb)\
**Post date:** [Février 21, 2016, 7:59 UTC](https://www.debian-fr.org/t/sed-supprimer-uniquement-la-ligne-concernee/61446/12 "2016-02-21T19:59:08Z")

</div>

Merci à vous deux ![:041](https://www.debian-fr.org/uploads/default/original/1X/bfe857c9119752799c3eac55ca37a50312c51282.gif "applaudit")

---

<div class="post-metadata">

**Author:** ![ricardo](https://www.debian-fr.org/user_avatar/www.debian-fr.org/ricardo/32/3864_2.png) [@ricardo](https://www.debian-fr.org/u/ricardo)\
**Post date:** [Février 21, 2016, 7:59 UTC](https://www.debian-fr.org/t/sed-supprimer-uniquement-la-ligne-concernee/61446/13 "2016-02-21T19:59:08Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![fran.b](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/f/d78d45/32.png) [@fran.b](https://www.debian-fr.org/u/fran.b)\
**Post date:** [Février 21, 2016, 7:59 UTC](https://www.debian-fr.org/t/sed-supprimer-uniquement-la-ligne-concernee/61446/14 "2016-02-21T19:59:14Z")

</div>

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?

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 7:59 UTC](https://www.debian-fr.org/t/sed-supprimer-uniquement-la-ligne-concernee/61446/15 "2016-02-21T19:59:14Z")

</div>

> [@fran.b](#):
>
> J’arrive après le déluge mais «grep -v -E «&nbsp;^seb@1test.local&nbsp;» 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).

---

<div class="post-metadata">

**Author:** ![\_seb](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/_/90db22/32.png) [@\_seb](https://www.debian-fr.org/u/_seb)\
**Post date:** [Février 21, 2016, 7:59 UTC](https://www.debian-fr.org/t/sed-supprimer-uniquement-la-ligne-concernee/61446/16 "2016-02-21T19:59:18Z")

</div>

Bonsoir,

Que veut dire le ~ après le i ?

```auto
sed -i~
```

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 7:59 UTC](https://www.debian-fr.org/t/sed-supprimer-uniquement-la-ligne-concernee/61446/17 "2016-02-21T19:59:19Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![\_seb](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/_/90db22/32.png) [@\_seb](https://www.debian-fr.org/u/_seb)\
**Post date:** [Février 21, 2016, 7:59 UTC](https://www.debian-fr.org/t/sed-supprimer-uniquement-la-ligne-concernee/61446/18 "2016-02-21T19:59:21Z")

</div>

Ha oui ![:030](https://www.debian-fr.org/uploads/default/original/1X/65b1b73704eec538091c0e1d04a633b3840a284f.gif "picole") !!

Merci 😉
