Eu quero executar um utilitário para substituir valores correspondentes a uma expressão regular. Isso significa que para cada correspondência de uma expressão regular, chame o utilitário com os caracteres que compõem a correspondência. A saída do utilitário substitui os caracteres originais.
Para fins de ilustração usando factor
:
$ factor 230
230: 2 5 23
Portanto, usando esse utilitário, quero selecionar os inteiros, chamar factor
com o inteiro e substituir o inteiro original pela saída de factor
.
Isso é o que eu esperaria de uma entrada de exemplo:
$ [code] <<< "Given the numbers with factors: 27, 13, 230, and 19, it is evident which are primes."
Given the numbers with factors: 27: 3 3 3, 13: 13, 230: 2 5 23, and 19: 19, it is evident which are primes.
Eu pensei que isso poderia funcionar, mas parece que está tentando interpretar a entrada diretamente. Usando sed (GNU sed) 4.2.2
.
$ sed -E 's/([0-9]+)/factor /ge' <<< 'Given the numbers with factors: 27, 13, 230, and 19, it is evident which are primes.'
sh: 1: Given: not found
Obviamente, não estou entendendo o que o e
flag faz. Remover o e
mostra que a expressão regular está puxando corretamente os inteiros e passando-os como
.
Eu tentei fazer isso em awk
:
$ awk '{r = gensub(/([0-9]+)/, system("factor \1"), "g"); print r}' <<< 'Given the numbers with factors: 27, 13, 230, and 19, it is evident which are primes.'
1:
Given the numbers with factors: 0, 0, 0, and 0, it is evident which are primes.
Não sei de onde vem o 1:
, mas é evidente que está imprimindo apenas o código de retorno de system
. Não parece haver uma maneira de capturar a saída padrão de um comando em awk
.
O que eu estou pedindo é possível usando os principais utilitários?