GNU/Linux >> Tutoriales Linux >  >> Linux

las banderas sed e y g no funcionan juntas

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


Linux
  1. id:comando no encontrado

  2. w:comando no encontrado

  3. df:comando no encontrado

  4. du:comando no encontrado

  5. Conseguir que sudo y nohup trabajen juntos

Comando de Rescate Grub. Grub no funciona en Ubuntu 13?

16 Ejemplos Prácticos y Útiles del Comando Echo en Linux

El comando Traceroute no funciona en Ubuntu

¿Por qué no se encuentra el comando sudo:bundle?

El comando de Linux 'll' no funciona

El comando Conda funciona en el símbolo del sistema pero no en el script bash