# AWK/SED pour editer/supprimer dans un fichier

**URL:** <https://www.debian-fr.org/t/awk-sed-pour-editer-supprimer-dans-un-fichier/34530>\
**Category:** Programmation\
**Created:** [Février 21, 2016, 3:42 UTC](https://www.debian-fr.org/t/awk-sed-pour-editer-supprimer-dans-un-fichier/34530 "2016-02-21T03:42:27Z")\
**Posts on this page:** 7\
**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, 3:42 UTC](https://www.debian-fr.org/t/awk-sed-pour-editer-supprimer-dans-un-fichier/34530/1 "2016-02-21T03:42:27Z")

</div>

Bonjour 😃

J’ai un fichier constitué d’adresse email (Alias pour Postfix) et je voudrais le gérer simplement (ajouter/modifier/supprimer) via un script Bash.

Exemple d’un fichier alias

```auto
user@domaine.local user@yahoo.fr userb@wanadoo.fr
moi@domaine2.local moi@monfai.net user@domaine.local
etc...
```

Je voudrais par exemple rajouter l’alias «&nbsp;[userx@fai.org](mailto:userx@fai.org)&nbsp;» pour «&nbsp;[user@domaine.local](mailto:user@domaine.local)&nbsp;» mais je ne sais pas trop comment faire, car pour compliquer la chose l’utilisateur «&nbsp;[moi@domaine2.local](mailto:moi@domaine2.local)&nbsp;» à aussi un alias pointant sur «&nbsp;[user@domaine.local](mailto:user@domaine.local)&nbsp;» ![:doh:](https://www.debian-fr.org/uploads/default/original/1X/78536cf08b5cbccb06a10e44ddb8da50bfc1554d.gif "Doh!")

Je voudrais aussi pouvoir enlever l’alias «&nbsp;[user@yahoo.fr](mailto:user@yahoo.fr)&nbsp;» de «&nbsp;[user@domaine.local](mailto:user@domaine.local)&nbsp;».

Sachant que dans mon fichier la première adresse ([user@domaine.local](mailto:user@domaine.local),moi@domaine2.local,etc…) est toujours unique mais par contre peut se trouver aussi en tant qu’Alias sur une adresse… ![:083](https://www.debian-fr.org/uploads/default/original/1X/d14bbab5e0eb9167fe7ed1d009c5a9b723425957.gif "yeux-ciel")

AWK/SED ne me donne pas de bon résultat, en gros je casse mon fichier ![:075](https://www.debian-fr.org/uploads/default/original/1X/660d70f9421e915a2561756e6d9f245d4f609347.gif "dequoi")

Au secours merci 😃

---

<div class="post-metadata">

**Author:** ![Rantanplan\_aussi](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/r/258eb7/32.png) [@Rantanplan\_aussi](https://www.debian-fr.org/u/Rantanplan_aussi)\
**Post date:** [Février 21, 2016, 3:42 UTC](https://www.debian-fr.org/t/awk-sed-pour-editer-supprimer-dans-un-fichier/34530/2 "2016-02-21T03:42:35Z")

</div>

> [@](#):
>
> Je voudrais par exemple rajouter l’alias «&nbsp;[userx@fai.org](mailto:userx@fai.org)&nbsp;» pour «&nbsp;[user@domaine.local](mailto:user@domaine.local)&nbsp;» mais je ne sais pas trop comment faire, car pour compliquer la chose l’utilisateur «&nbsp;[moi@domaine2.local](mailto:moi@domaine2.local)&nbsp;» à aussi un alias pointant sur «&nbsp;[user@domaine.local](mailto:user@domaine.local)&nbsp;» ![:doh:](https://www.debian-fr.org/uploads/default/original/1X/78536cf08b5cbccb06a10e44ddb8da50bfc1554d.gif "Doh!")

```auto
sed "s/^\(user@domaine\.local\)/\1 userx@fai.org/" nom_de_ton_fichier_d_alias
```

si tu vois que ça marche, tu finalises par :

```auto
sed -i~ "s/^\(user@domaine\.local\)/\1 userx@fai.org/" nom_de_ton_fichier_d_alias
```

pour :

> [@](#):
>
> Je voudrais aussi pouvoir enlever l’alias «&nbsp;[user@yahoo.fr](mailto:user@yahoo.fr)&nbsp;» de «&nbsp;[user@domaine.local](mailto:user@domaine.local)&nbsp;».

tu peux essayer :

```auto
sed "s/^\(user@domaine\.local.*\)\( user@yahoo\.fr\)\(.*$\)/\1\3/" nom_de_ton_fichier_d_alias
```

Peut-être que ça ne marchera pas si l’email est le dernier du domaine en question, pas testé ce cas (à toi de bosser quand même !)

Edit: apparemment ça ne marche pas si email en fin de ligne. Cherche un peu, j’ai pas trop le temps  
Edit 2 :Si ça marche en fait même si email en fin de ligne, liquide vaisselle ?

Pareil, si ça marche tu finalise avec -i~, évidement sudo si nécessaire …

---

<div class="post-metadata">

**Author:** ![Totor](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/t/58f4c7/32.png) [@Totor](https://www.debian-fr.org/u/Totor)\
**Post date:** [Février 21, 2016, 3:44 UTC](https://www.debian-fr.org/t/awk-sed-pour-editer-supprimer-dans-un-fichier/34530/3 "2016-02-21T03:44:22Z")

</div>

Depuis le temps que je l’avais initié :

[code]#!/bin/bash

nomScript="${0##\*/}"  
function gestHelp  
{  
e=$1  
shift  
cat \>&2 \<\<HELP  
$@  
Usage : ${nomScript} -f fichier [-c|-s email [-a alias[,…]]| -m email -a old -n new]  
-f : fichier à traiter  
-c, -s : Création ou suppression d’une adresse mail.  
Si l’option -a est utilisée avec l’instruction -c, les alias sont ajoutés. L’adresse mail est créée si inexistante.  
Si l’option -a est utilisée avec l’instruction -s, seuls les alias spécifiés sont supprimés.  
-m : l’alias est remplacé par pour l’adresse email donnée.  
HELP  
exit $e  
}

function erreur  
{  
e=$1  
shift  
echo \>&2 "Erreur : $@"  
exit $e  
}

function action\_c  
{  
trouve=false  
while read  
do  
set – ${REPLY}  
email=$1  
shift  
if [[${email} == ${\_email}]]  
then  
trouve=true  
for unAlias in "${\_alias[@]}"  
do  
[[$@ == _${unAlias}_]] || set – $@ ${unAlias}  
done  
echo "${\_email} " "$@"  
else  
echo "${REPLY}"  
fi  
done

```
${trouve} || echo "${_email} " ${_alias[@]}
:

```

}

function action\_m  
{  
while read  
do  
set – ${REPLY}  
email=$1  
shift  
if [[${email} == ${\_email}]] && [[$@ != _${\_nalias}_]]  
then  
infos=( $@ )  
for idx in ${!infos[@]}  
do  
[[${infos[idx]} == ${\_alias} ]] && infos[idx]=${\_nalias}  
done  
echo "${\_email} " ${infos[@]}  
else  
echo "${REPLY}"  
fi  
done  
:  
}

function action\_s  
{  
while read  
do  
set – ${REPLY}  
email=$1  
shift  
if [[${email} == ${\_email}]]  
then  
sesAlias=  
[[${\_alias[@]} ]] && for ele  
do  
[[${\_alias[@]} == _${ele}_ ]] || sesAlias+=( ${ele} )  
done  
[[${sesAlias[@]} ]] && echo "${email} " ${sesAlias[@]}  
else  
echo "${REPLY}"  
fi  
done  
:  
}

_tmpFile="${TMPDIR:-/tmp}/$$_${nomScript}"

\_email=  
\_alias=  
\_nalias=  
\_fichier=  
\_action=  
while getopts :f:c:m:s:a:n: option  
do  
case $option in  
"?") gestHelp 1 “Option non valide : -${OPTARG}”;;  
":") gestHelp 1 “Argument manquant pour l’option -${OPTARG}”;;  
f) \_fichier="${OPTARG}";;  
c|s|m) \_action+=${option}  
\_email=${OPTARG};;  
a) \_alias=( ${OPTARG//,/ } );;  
n) \_nalias="${OPTARG}";;  
esac  
done

[[${\_fichier}]] || gestHelp 2 “Je ne sais pas dans quel fichier écrire !”

[[-f “${\_fichier}”]] || gestHelp 2 "Fichier non trouvé : " “${\_fichier}”

[[${\_action}]] || gestHelp 2 “Je ne sais pas quelle action réaliser !”

[[${#\_action} == 1]] || gestHelp 2 “Je ne sais pas traiter plusieurs actions en même temps !”

[[${\_action} = m]] && {  
(( ${#\_alias[@]} == 0 )) && gestHelp 2 “Quel alias dois-je modifier ?”  
(( ${#\_alias[@]} \> 1 )) && gestHelp 2 “Je ne sais modifier qu’un seul alias à la fois !”  
[[${\_nalias}]] || gestHelp 2 “Dois-je deviner la nouvelle valeur de l’alias ?”  
}

touch “${\_tmpFile}” &\>/dev/null || erreur 3 “Impossible de créer le fichier temporaire.”

(  
shopt -s nocasematch  
rm "${\_tmpFile}"  
exec \> “${\_tmpFile}” \< "${_fichier}"  
eval action_${\_action}  
) && [-f “${\_tmpFile}”] && mv “${\_tmpFile}” “${\_fichier}”[/code]

note : je n’ai volontairement pas mis de commentaire ni utilisé sed/awk …

---

<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, 3:44 UTC](https://www.debian-fr.org/t/awk-sed-pour-editer-supprimer-dans-un-fichier/34530/4 "2016-02-21T03:44:24Z")

</div>

```auto
Pourquoi ne pas simplement utiliser :
[code]mktemp "XXX_${nomScript}"[/code]
ou
[code]mktemp --tmpdir="${TMPDIR:-/tmp}" "XXX_${nomScript}"[/code]
Sinon j'aime bien ton script.
```

Pourquoi ne pas simplement utiliser :

```auto

```

ou

```auto

```

Sinon j’aime bien ton script.

---

<div class="post-metadata">

**Author:** ![Totor](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/t/58f4c7/32.png) [@Totor](https://www.debian-fr.org/u/Totor)\
**Post date:** [Février 21, 2016, 3:44 UTC](https://www.debian-fr.org/t/awk-sed-pour-editer-supprimer-dans-un-fichier/34530/5 "2016-02-21T03:44:24Z")

</div>

pourquoi pas mktemp ?  
En fait, je préfère utiliser le pid du process comme partie dynamique du fichier. Cela me permet d’associer le fichier temporaire au processus si le script est lancé plusieurs fois (je ne parle pas forcément de ce script, mais en règle générale). Alors certes, on peut valoriser le template avec le pid mais dans ce cas le mécanisme de mktemp n’a plus d’intérêt.

Sinon merci !

---

<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, 3:44 UTC](https://www.debian-fr.org/t/awk-sed-pour-editer-supprimer-dans-un-fichier/34530/6 "2016-02-21T03:44:25Z")

</div>

[quote=“Totor”]pourquoi pas mktemp ?  
En fait, je préfère utiliser le pid du process comme partie dynamique du fichier. Cela me permet d’associer le fichier temporaire au processus si le script est lancé plusieurs fois (je ne parle pas forcément de ce script, mais en règle générale). Alors certes, on peut valoriser le template avec le pid mais dans ce cas le mécanisme de mktemp n’a plus d’intérêt.[/quote]  
Il en garde toujours car tu as la garanti que ton fichier est unique (en fait en C il effectue un open avec l’option O\_EXCL ce qui assure que c’est lui qui vient de le créer et pas quelqu’un d’autre, probablement via la fonction mktemp du C).

La probabilité de collision est faible, pas inexistante 🙂

---

<div class="post-metadata">

**Author:** ![Totor](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/t/58f4c7/32.png) [@Totor](https://www.debian-fr.org/u/Totor)\
**Post date:** [Février 21, 2016, 3:44 UTC](https://www.debian-fr.org/t/awk-sed-pour-editer-supprimer-dans-un-fichier/34530/7 "2016-02-21T03:44:25Z")

</div>

oui, je vois la nuance …  
je n’y voyais que l’intérêt de l’unicité mais pas de la propriété (au sens appartenance)
