Tengo una lista de direcciones de memoria aleatorias guardadas en un archivo de texto, y necesito sed
eliminarlas, 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 sed
comando; 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 sed
NO ejecuta comandos. ¿Es cierto que sed
no permite la ejecución de comandos? Si es así, suponiendo que el comando que he escrito es una sed
secuencia válida , ¿cómo lo escribiría perl
?
fuente
Respuestas:
perl -pe
: likesed
: procesa la entrada una línea a la vez$_
, evalúa la expresión perl [e] x pasada-e
para cada línea y [p] rint la modificación$_
para cada una.s|X|Y|gei
: SustitutoY
paraX
en$_
([g] lobally, caso [i] nsensitively, y tratarY
como un Perl [e] Xpression lugar de una cadena básica).(?<=0x)
: mira hacia atrás para0x
.[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.fuente
/
aquí, ya que se usa dentro de la pieza de repuesto. CorregidoPuede o no ser cierto que
sed
no pueda ejecutar comandos. Es no verdadera de un GNUsed
:No me queda claro exactamente qué más podría haber en su
<$1
entrada, por lo que me aseguro de#
comentar cualquier cosa que no estécommand \2
en el espacio del patrón. Cuando usa ele
indicador xecute de GNU en unas///
sustitución, pasa todo el espacio de patrón resultante$SHELL -c
como su segundo argumento, y luego reemplaza todo el espacio de patrón con lo que esté escrito en ese$SHELL
stdout. 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.fuente