Ejecute un comando dentro de 'sed'

9

Tengo una lista de direcciones de memoria aleatorias guardadas en un archivo de texto, y necesito sedeliminarlas, decodificarlas y guardarlas nuevamente en mi archivo. Sin embargo, la operación de decodificación que intento realizar se maneja en un programa C ++ que he creado hace algún tiempo. El problema que encuentro ahora es ejecutar C ++ dentro del sedcomando; es decir, quiero hacer una referencia a la parte que necesita ser decodificada y usarla como argumento en mi programa C ++. He escrito el siguiente comando:

cat $1 | sed -r 's/(0[Xx])([0-9A-Za-z]{1,8})/\1`./convAddrs \2`/g';

antes tuve la oportunidad de leer una respuesta en esta publicación que decía que sedNO ejecuta comandos. ¿Es cierto que sedno permite la ejecución de comandos? Si es así, suponiendo que el comando que he escrito es una sedsecuencia válida , ¿cómo lo escribiría perl?

Fadi Hanna AL-Kass
fuente
enlace agregado. my bad :)
Fadi Hanna AL-Kass

Respuestas:

8
perl -pe 's|(?<=0x)[0-9a-f]{1,8}|`./convAddrs $&`|gei'
  • perl -pe: like sed: procesa la entrada una línea a la vez $_, evalúa la expresión perl [e] x pasada -epara cada línea y [p] rint la modificación $_para cada una.
  • s|X|Y|gei: Sustituto Ypara Xen $_([g] lobally, caso [i] nsensitively, y tratar Ycomo un Perl [e] Xpression lugar de una cadena básica).
  • (?<=0x): mira hacia atrás para 0x.
  • [0-9a-f]{1,8}: de uno a 8 dígitos hexadecimales, tantos como sea posible
  • `./convAddrs $&`: reemplazar por la salida de esa línea de comando de shell donde $&se reemplaza por la parte coincidente.
Stéphane Chazelas
fuente
Recibo el siguiente error al ejecutar su comando: no tener espacio entre el patrón y la palabra siguiente está en desuso en la línea -e 1. Los modificadores de expresiones regulares "/ a" y "/ d" son mutuamente excluyentes en la línea -e 1, al final de los modificadores Regexp de línea "/ a" y "/ d" son mutuamente exclusivos en la línea 1, al final de la línea No se puede encontrar el terminador de cadena "` "en ningún lugar antes de EOF en la línea 1.
E
1
Por supuesto, lo siento, es necesario cambiar el separador ya que no podemos usarlo /aquí, ya que se usa dentro de la pieza de repuesto. Corregido
Stéphane Chazelas
Joder, y yo a pesar de que yo era bastante bueno en Perl trazadores de líneas uno, 1!
terdon
2

Puede o no ser cierto que sedno pueda ejecutar comandos. Es no verdadera de un GNU sed:

sed -Ee 's/(0[Xx])([0-9A-Za-z]{1,8})/\1\n ./convAddrs \2\n#/g' \
-eh -e  's/\n.//gp;g;s/^/#/e' <"$1"

No me queda claro exactamente qué más podría haber en su <$1entrada, por lo que me aseguro de #comentar cualquier cosa que no esté command \2en el espacio del patrón. Cuando usa el eindicador xecute de GNU en una s///sustitución, pasa todo el espacio de patrón resultante $SHELL -ccomo su segundo argumento, y luego reemplaza todo el espacio de patrón con lo que esté escrito en ese $SHELLstdout. Así que arriba imprimo cualesquiera que fueran sus resultados antes, y luego después de los resultados de pasar la línea de comandos al shell.

mikeserv
fuente