Tenho uma lista de endereços de memória aleatória salvos em um arquivo de texto e preciso sed
removê-los, decodificá-los e salvá-los novamente em meu arquivo. No entanto, a operação de decodificação que estou tentando executar é tratada em um programa C ++ que criei há algum tempo. O problema que estou encontrando agora está executando o C ++ dentro do sed
comando; isto é, quero fazer referência prévia à parte que precisa ser decodificada e usá-la como argumento no meu programa C ++. Eu escrevi o seguinte comando:
cat $1 | sed -r 's/(0[Xx])([0-9A-Za-z]{1,8})/\1`./convAddrs \2`/g';
antes que eu tivesse a chance de ler uma resposta neste post dizendo que sed
NÃO executa comandos. É verdade que sed
não permite a execução de comandos? Se sim, supondo que o comando que escrevi seja uma sed
sequência válida , como eu o escreveria perl
?
fonte
Respostas:
perl -pe
: likesed
: processa a entrada uma linha de cada vez$_
, avalia o perl [e] xpression passado-e
para cada linha e [p] rint o modificado$_
para cada.s|X|Y|gei
: SubstitutoY
paraX
em$_
([g] lobally, caso [i] nsensitively, e tratandoY
como um perl xpression [e] em vez de uma cadeia de base).(?<=0x)
: olhar para trás0x
.[0-9a-f]{1,8}
: um a 8 dígitos hexadecimais, o maior número possível`./convAddrs $&`
: substitua pela saída dessa linha de comando do shell, onde$&
é substituída pela parte correspondente.fonte
/
aqui, pois ele é usado dentro da peça de reposição. Corrigido.Pode ou não ser verdade que
sed
não pode executar comandos. É não verdadeira de um GNUsed
:Não está claro para mim exatamente o que mais pode estar em sua
<$1
opinião e, portanto, tomo o cuidado de#
comentar qualquer coisa que não estejacommand \2
no espaço do padrão. Quando você usa oe
sinalizador xecute do GNU em umas///
ubstituição, ele passa todo o espaço do padrão resultante para$SHELL -c
o seu segundo argumento e, posteriormente, substitui todo o espaço do padrão pelo que estiver gravado no$SHELL
stdout. Então, acima, imprimo os resultados anteriores antes e depois dos resultados da passagem da linha de comando para o shell.fonte