¿Cómo indicarle a sed que sustituya solo una vez mientras se usan múltiples expresiones sustitutas?

¿Cómo indicarle a sed que sustituya solo una vez mientras se usan múltiples expresiones sustitutas?

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 tcomando después de cada scomando 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 tcomando 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

información relacionada