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 ;exemple /foo/d;/bar/det groupées par {...} exemple, /foo/{h;d}mais pour les i,a,ccommandes, cela -efournit un moyen de séparer les commandes.
L’alternative consiste à utiliser le shell (bash) pour insérer une nouvelle ligne:
sed '/foo/i\bar'$'\n''/fred/a\barney'$'\n''/harry/c\potter' file
Sur certaines implémentations au moins de sed (par exemple, sur FreeBSD), vous devez également mettre fin aux étiquettes et aux commandes de branche en utilisant newlines / -e, plutôt que par des points-virgules. Cela ne fonctionnera pas: sed ':a; /x/ { s/x/y/g; ba }; q' <<< "jxm". Mais cette volonté:sed -e ':a' -e '/x/ { s/x/y/g; ba' -e '}; q' <<< "jxm"
dubiousjim
Je ne suis pas sûr de la nécessité de la must be terminated with a newlinephrase signifie ici. Quand je l' ai testé ici dans mon cygwin, cela fonctionne: sed '/foo/i\bar' file. Alors, maintenant que nous pouvons fusionner les expressions séparées en une seule, cela nous ramène à la question initiale: quel est le véritable but de la -e?
Typelogic
1
-e, équivalent à --expression, est facultatif, sauf si vous réunissez plusieurs expressions (non communes) comme indiqué dans une autre réponse .
Aside: ;peut être utilisé à la place dans la même expression pour exécuter plusieurs expressions les unes après les autres.
-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/le script est exécuté par sed. La deuxième option est plus explicite, mais ce n’est probablement pas la raison pour laquelle vous voyez souvent -eutilisé. La raison en est que -ecela permet d’utiliser plus d’un script avec le même appel de sed. Cela laisse toujours la question pourquoi l'utiliser si vous utilisez un seul script? L'exemple suivant pourrait expliquer cela:
echo "foo" | sed -e 's/foo/bar/' -e 's/bar/foo'
Sera sortie "foo".
cependant,
echo "foo" | sed 's/foo/bar/' -e 's/bar/foo'
échouera car sedinterprète maintenant le premier s/foo/barcomme un nom de fichier. Par conséquent, pour vous faciliter la vie, vous pouvez déjà commencer à utiliser le -edrapeau aujourd'hui. De cette façon, vous pouvez désormais ajouter à la commande un script supplémentaire en utilisant -e <script>.
NB Dans d'autres réponses, l' ;utilisation de plusieurs scripts a été suggérée. Bien que cela soit techniquement possible dans certains cas, cela n’est pas encourageant, car cela conduit rapidement à une lecture très difficile du code. Voir un exemple ici: https://www.grymoire.com/Unix/Sed.html#uh-61
man sed
?Réponses:
De la page de manuel:
Vous pouvez donc utiliser plusieurs
-e
options pour créer un script à partir de nombreuses parties.Tout d'abord remplacer
foo
parbar
, puis supprimer toutes les lignes contenantFOO
.la source
-e
Cela pourrait fonctionner pour vous:
Dans chaque cas, les commandes
i
(insérer),a
(ajouter) etc
(modifier) doivent être terminées par une nouvelle ligne.Normalement, les commandes peuvent être séparées par
;
exemple/foo/d;/bar/d
et groupées par{...
} exemple,/foo/{h;d}
mais pour lesi,a,c
commandes, cela-e
fournit un moyen de séparer les commandes.L’alternative consiste à utiliser le shell (bash) pour insérer une nouvelle ligne:
la source
-e
, plutôt que par des points-virgules. Cela ne fonctionnera pas:sed ':a; /x/ { s/x/y/g; ba }; q' <<< "jxm"
. Mais cette volonté:sed -e ':a' -e '/x/ { s/x/y/g; ba' -e '}; q' <<< "jxm"
must be terminated with a newline
phrase signifie ici. Quand je l' ai testé ici dans moncygwin
, cela fonctionne:sed '/foo/i\bar' file
. Alors, maintenant que nous pouvons fusionner les expressions séparées en une seule, cela nous ramène à la question initiale: quel est le véritable but de la-e
?-e
, équivalent à--expression
, est facultatif, sauf si vous réunissez plusieurs expressions (non communes) comme indiqué dans une autre réponse .Aside:
;
peut être utilisé à la place dans la même expression pour exécuter plusieurs expressions les unes après les autres.la source
Dans l'aide pour
sed
vous, ce-e
drapeau signifie:Mais vous n'êtes pas le premier à être confus après avoir rencontré
-e
. Dans votre exemplesed 's/foo/bar/'
etsed -e 's/foo/bar/'
sont équivalents. Dans les deux cas,s/foo/bar/
le script est 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
cela permet d’utiliser plus d’un script avec le même appel desed
. Cela laisse toujours la question pourquoi l'utiliser si vous utilisez un seul script? L'exemple suivant pourrait expliquer cela:echo "foo" | sed -e 's/foo/bar/' -e 's/bar/foo'
Sera sortie "foo".
cependant,
echo "foo" | sed 's/foo/bar/' -e 's/bar/foo'
échouera car
sed
interprète maintenant le premiers/foo/bar
comme un 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 désormais ajouter à la commande un script supplémentaire en utilisant-e <script>
.NB Dans d'autres réponses, l'
;
utilisation de plusieurs scripts a été suggérée. Bien que cela soit techniquement possible dans certains cas, cela n’est pas encourageant, car cela conduit rapidement à une lecture très difficile du code. Voir un exemple ici: https://www.grymoire.com/Unix/Sed.html#uh-61la source