Tengo varias reglas de sustitución pero quiero usar solo la primera regla aplicable. sed
, de forma predeterminada, continúa procesando la salida con las reglas restantes. ¿Cómo rompo después de la primera sustitución? ¿Es posible usar just sed
? No pude encontrar una opción en el manual.
Producción real
$ sed "s/something/else/; s/one/two/; s/two/three/;" <<<"one"
three
Operación deseada
$ sed "s/something/else/; s/one/two/; s/two/three/;" <<<"one"
two
Respuesta1
Utilice el t
comando después de cada s
comando para pasar al final del script si se realizó una sustitución:
sed -e 's/something/else/;t' \
-e 's/one/two/;t' \
-e 's/two/three/;t' <<<"one"
Aquí, el t
comando después de la última sustitución no es necesario, pero si genera este código automáticamente, no hay problema en permitir que agregue el sufijo a cada uno s
, incluso al último.
Respuesta2
sed con rama 't' en otro comando es la respuesta perfecta.
Esto es sólo una sugerencia, en caso de que desee hacer varias cosas dentro si se reemplaza, puede usarawk:
awk ' { if (gsub("something","else",$0) || gsub("one","two",$0) || gsub("two","three",$0) ){ print $0;exit}; }' <<<"one"
Respuesta3
Estos se evalúan en orden, por lo que si no hay un círculo y puedes hacerlo fácilmente, puedes usar
s/two/three/; s/one/two/; s/something/else/
Si hay un círculo, o la lista se genera a partir de otros datos, puede utilizar un marcador, por ejemplo
s/@/@@/g
s/one/t@wo/
s/two/t@hree/
s/something/e@lse/
s/@\(.\)/\1/g