Je ne trouve aucune documentation sur le sed
-e
switch, pour un simple remplacement, en ai-je besoin?
par exemple.
sed 's/foo/bar/'
CONTRE
sed -e 's/foo/bar/'
Depuis la page de manuel:
-e script, --expression=script
add the script to the commands to be executed
Vous pouvez donc utiliser plusieurs -e
options pour construire un script à partir de nombreuses parties.
$ sed -e "s/foo/bar/" -e "/FOO/d"
Remplacerait d'abord foo
par bar
, puis supprimerait chaque ligne contenant FOO
.
Cela pourrait fonctionner pour vous:
sed -e '/foo/i\' -e 'bar' -e '/fred/a\' -e 'barny' -e '/harry/c\' -e 'potter' file
Dans chaque cas, les commandes i
(insérer), a
(ajouter) et c
(modifier) doivent être terminées par une nouvelle ligne.
Normalement, les commandes peuvent être séparées par un ;
par exemple. /foo/d;/bar/d
et regroupés par {...
} par exemple. /foo/{h;d}
mais pour le i,a,c
commande le -e
fournit un moyen de séparer les commandes.
L'alternative est d'utiliser le Shell (bash) pour insérer une nouvelle ligne:
sed '/foo/i\bar'$'\n''/fred/a\barney'$'\n''/harry/c\potter' file
-e
, équivalent à --expression
, est facultatif, sauf si vous enchaînez plusieurs expressions ensemble (pas commun) comme indiqué dans un autre Answer .
De côté: ;
peut être utilisé à la place dans la même expression pour exécuter plusieurs expressions l'une après l'autre.
Dans l'aide de sed
, vous constaterez que -e
drapeau signifie:
-e script, --expression=script
add the script to the commands to be executed
Mais vous n'êtes pas le premier à être confus après avoir rencontré -e
. Dans votre exemple sed 's/foo/bar/'
et sed -e 's/foo/bar/'
sont équivalents. Dans les deux cas s/foo/bar/
est le script exécuté par sed. La deuxième option est plus explicite, mais ce n'est probablement pas la raison pour laquelle vous voyez souvent -e
utilisé. La raison en est que -e
permet d'utiliser plusieurs scripts avec le même appel de sed
. Cela laisse toujours la question de savoir pourquoi l'utiliser si vous n'utilisez qu'un seul script? L'exemple suivant pourrait expliquer cela:
echo "foo" | sed -e 's/foo/bar/' -e 's/bar/foo'
Sortira "foo".
Cependant,
echo "foo" | sed 's/foo/bar/' -e 's/bar/foo'
échouera car maintenant sed
interprète le premier s/foo/bar
comme nom de fichier. Par conséquent, pour vous faciliter la vie, vous pouvez déjà commencer à utiliser le -e
drapeau aujourd'hui. De cette façon, vous pouvez simplement ajouter la commande à un script supplémentaire en utilisant -e <script>
.
N.B. Dans d'autres réponses, utilisez ;
comme alternative à l'utilisation de plusieurs scripts a été suggérée. Bien que cela soit techniquement possible dans certains cas, cela n'est pas encouragé, car cela conduit rapidement à un code très difficile à lire. Voir un exemple ici: https://www.grymoire.com/Unix/Sed.html#uh-61