Execute um comando dentro de 'sed'

8

Eu tenho uma lista de endereços de memória aleatórios salvos em um arquivo de texto, e preciso sed deles, decodificá-los e salvá-los de volta no meu arquivo. No entanto, a operação de decodificação que estou tentando executar é tratada em um programa C ++ que eu criei há algum tempo. O problema que estou encontrando agora é executar o C ++ dentro do comando sed ; isto é, quero voltar a referenciar a parte que precisa ser decodificada e usá-la como um argumento no meu programa C ++. Eu escrevi o seguinte comando:

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

antes que eu tivesse a chance de ler uma resposta em poste dizendo que sed NÃO executa comandos. É verdade que sed não permite a execução de comandos? Se sim, assumindo que o comando que eu escrevi é uma seqüência sed válida, como eu escreveria em perl ?

    
por Fadi Hanna AL-Kass 31.07.2013 / 19:05

2 respostas

8
perl -pe 's|(?<=0x)[0-9a-f]{1,8}|'./convAddrs $&'|gei'
  • perl -pe : como sed : processa a entrada uma linha por vez em $_ , avalie a xpressão perl [e] passada para -e para cada linha e [p] obtenha o $_ modificado para cada.
  • s|X|Y|gei : substitua Y por X em $_ ([g] lobally, caso [i] sem sensibilidade, e tratando Y como uma expressão perl [e] em vez de uma sequência básica).
  • (?<=0x) : olhe atrás para 0x .
  • [0-9a-f]{1,8} : um a oito dígitos hexadecimais, o maior número possível
  • './convAddrs $&' : substitua pela saída dessa linha de comando do shell, em que $& é substituído pela parte correspondente.
por 31.07.2013 / 19:18
1

Pode ou não ser verdade que sed não pode executar comandos. Não é verdadeiro de um GNU sed :

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

Não está claro para mim exatamente o que mais pode estar na sua <$1 de entrada, e por isso eu tomo cuidado para # comentar qualquer coisa que não seja command no espaço padrão. Quando você usa o sinalizador e xecute do GNU em um s/// ubstitution, ele transmite todo o espaço padrão resultante para $SHELL -c como seu segundo argumento e, em seguida, substitui todo o espaço-padrão pelo que está escrito nesse $SHELL ' s stdout. Então, acima de eu imprimo o que quer que seus resultados foram antes primeiro, e depois os resultados de passar a linha de comando para o shell.

    
por 04.12.2015 / 19:36