web-dev-qa-db-fra.com

Quel est le but de -e dans la commande sed?

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/'
46
Howard

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.

32
user16144

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
27
potong

-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.

1
flow2k

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

1
BakaKuna