Execute um comando dentro de 'sed'

9

Tenho uma lista de endereços de memória aleatória salvos em um arquivo de texto e preciso sedremovê-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 sedcomando; 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 sedNÃO executa comandos. É verdade que sednão permite a execução de comandos? Se sim, supondo que o comando que escrevi seja uma sedsequência válida , como eu o escreveria perl?

Fadi Hanna AL-Kass
fonte
link adicionado. meu bad :) #
Fadi Hanna AL-Kass

Respostas:

8
perl -pe 's|(?<=0x)[0-9a-f]{1,8}|`./convAddrs $&`|gei'
  • perl -pe: like sed: processa a entrada uma linha de cada vez $_, avalia o perl [e] xpression passado -epara cada linha e [p] rint o modificado $_para cada.
  • s|X|Y|gei: Substituto Ypara Xem $_([g] lobally, caso [i] nsensitively, e tratando Ycomo um perl xpression [e] em vez de uma cadeia de base).
  • (?<=0x): olhar para trás 0x.
  • [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.
Stéphane Chazelas
fonte
Estou recebendo o seguinte erro ao executar seu comando: Não há espaço entre o padrão e a palavra a seguir preterida na linha -e 1. Os modificadores de expressão regular "/ a" e "/ d" são mutuamente exclusivos na linha -e 1, no final modificadores de linha Regexp "/ a" e "/ d" são mutuamente exclusivos na linha -e 1, no final da linha Não é possível encontrar o terminador de cadeia "` "em qualquer lugar antes do EOF na linha -e 1.
Fadi Hanna AL-Kass
1
Obviamente, desculpe, você precisa alterar o separador, pois não podemos usar /aqui, pois ele é usado dentro da peça de reposição. Corrigido.
Stéphane Chazelas
Maldição, e eu no entanto, que eu era muito bom em Perl forros, +1!
terdon
2

Pode ou não ser verdade que sednão pode executar comandos. É não verdadeira de um 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"

Não está claro para mim exatamente o que mais pode estar em sua <$1opinião e, portanto, tomo o cuidado de #comentar qualquer coisa que não esteja command \2no espaço do padrão. Quando você usa o esinalizador xecute do GNU em uma s///ubstituição, ele passa todo o espaço do padrão resultante para $SHELL -co seu segundo argumento e, posteriormente, substitui todo o espaço do padrão pelo que estiver gravado no $SHELLstdout. Então, acima, imprimo os resultados anteriores antes e depois dos resultados da passagem da linha de comando para o shell.

mikeserv
fonte