Je ne trouve aucune documentation sur le sed
-e
commutateur. Pour un remplacement simple, en ai-je besoin?
par exemple
sed 's/foo/bar/'
CONTRE
sed -e 's/foo/bar/'
Je ne trouve aucune documentation sur le sed
-e
commutateur. Pour un remplacement simple, en ai-je besoin?
par exemple
sed 's/foo/bar/'
CONTRE
sed -e 's/foo/bar/'
Réponses:
De 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 créer un script à partir de nombreuses parties.
$ sed -e "s/foo/bar/" -e "/FOO/d"
Tout d'abord remplacer foo
par bar
, puis supprimer toutes les lignes contenant FOO
.
-e
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/d
et groupées par {...
} exemple, /foo/{h;d}
mais pour les i,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:
sed '/foo/i\bar'$'\n''/fred/a\barney'$'\n''/harry/c\potter' file
-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 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
?
Dans l'aide pour sed
vous, ce -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/
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 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 sed
interprète maintenant le premier s/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-61
man sed
?