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]
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.
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…
#!/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.
@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.localother@fai.com » doit disparaitre du fichier et strictement rien de plus
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