Las banderas funcionan juntas de manera opuesta a lo que esperas. La documentación de /e
es, para que conste:
Este comando permite canalizar la entrada de un comando de shell al espacio de patrones. Si se realizó una sustitución, se ejecuta el comando que se encuentra en el espacio de patrones y el espacio de patrones se reemplaza con su salida. Se suprime una nueva línea final; los resultados no están definidos si el comando que se va a ejecutar contiene un carácter nulo. Esta es una extensión sed de GNU.
Eso está un poco tortuosamente escrito. Lo que significa es que, después de completar un s///
comando para esta línea, si hubo un cambio, la línea (nueva) se ejecuta como un comando y su salida se usa como reemplazo de esta línea.
Así que para tu comando dado:
echo AAA | sed -r 's/A/echo B/ge'
primero reemplaza cada A
con echo B
y luego ejecuta el resultado como un comando. Tiene (en términos generales) el mismo efecto que:
echo AAA | sed -r 's/A/echo B/g' | sh
GNU sed
no admite directamente el modo que desea, aunque puede falsificarlo con un script más complejo si lo desea. Alternativamente, /e
de Perl modificador a su s
El comando tiene el comportamiento que está buscando, pero con expresiones Perl en su lugar.
Tu eres obteniendo múltiples reemplazos, pero no obtienes múltiples ejecuciones. El patrón se ejecuta una vez que se han realizado todos los reemplazos.
Sin el e
marcar el resultado de
echo AAA | sed -r 's/A/echo B/g'
es
echo Becho Becho B
Así que esa es la línea de comando que se ejecuta si haces incluir el e
bandera, que es equivalente a
echo 'Becho Becho B'
Para obtener 'BBB' de 'AAA' usando el comando 's' de GNU sed con la bandera 'e', se puede hacer esto:
echo AAA | sed -re 's/A/echo -n B;/ge'
El 'AAA' se sustituye por 'echo -n B;echo -n B; echo -n B;', que, cuando finalmente se ejecuta, conduce a 3 comandos de eco que se ejecutan secuencialmente, uno para cada una de las coincidencias globales. La '-n' omite los caracteres de avance de línea de la salida de echo, lo que hace que las 'B' terminen en una línea (pero sed agrega un salto de línea por sí mismo cuando finalmente imprime el espacio del patrón).