Quel est le but de -e in sed command?

42

Je ne trouve aucune documentation sur le sed -ecommutateur. Pour un remplacement simple, en ai-je besoin?

par exemple

sed 's/foo/bar/'

CONTRE

sed -e 's/foo/bar/'
Howard
la source
14
Êtes-vous sûr de ne pas l'avoir trouvé man sed?
4
Vous ne trouvez pas d'explication de potongs, pourquoi ne pas utiliser "cmd1; cmd2"
utilisateur inconnu

Réponses:

29

De la page de manuel:

-e script, --expression=script

    add the script to the commands to be executed

Vous pouvez donc utiliser plusieurs -eoptions pour créer un script à partir de nombreuses parties.

$ sed -e "s/foo/bar/" -e "/FOO/d"

Tout d'abord remplacer foopar bar, puis supprimer toutes les lignes contenant FOO.


la source
3
Donc, vous n'avez pas besoin de '-e' si vous n'avez qu'un seul script, non?
JohnyTex
Moi aussi, je cherche le vrai but de-e
typelogic
27

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 ;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
lcd047
la source
1
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.

flow2k
la source
0

Dans l'aide pour sedvous, ce -edrapeau 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/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

BakaKuna
la source