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
Então, usando este utilitário, quero escolher os inteiros, chamar factor
com o inteiro e substituir o inteiro original pela saída de factor
.
Isto é o que eu esperaria em uma entrada de amostra:
$ [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 \1/ge' <<< 'Given the numbers with factors: 27, 13, 230, and 19, it is evident which are primes.'
sh: 1: Given: not found
Obviamente eu não estou entendendo o que a e
bandeira faz. A remoção do e
mostra que a expressão regular está retirando corretamente os inteiros e passando-os como \1
.
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 tenho certeza 1:
de onde vem, mas é aparente 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 no awk
.
O que estou pedindo é possível usando os utilitários principais?
Possível em Perl. Usando split , map , scalar , lc , reverse , ucfirst , join . Um pouco mais complexo do que eu pensava originalmente por causa das vírgulas e da sensibilidade ao contexto da correspondência.
Execute o seguinte:
A razão pela qual seu comando sed não está funcionando é porque o sed executará todo o espaço de padrão, diferentemente do Perl, que está alinhado com como você estava pensando e executa tanto quanto está no rhs do comando s/// e substitui muito isso com a saída do comando.
E é exatamente por isso que se você notar que o sed estava usando o utilitário "Given:" não encontrado. Dado foi o início do seu espaço de padrão. HTH
Tente a solução awk abaixo:
Pegue cada letra da palavra caractere por caractere afirmando do último. Se for o último caractere, converta para maiúscula e imprima, caso contrário, imprima em minúscula.
Execute o seguinte: