Quero substituir um número em um arquivo de texto pelo enésimo primo, tenho um executável que calcula o enésimo primo, como usar esse comando sed
para substituir cada número na frente ##
com seunthprime
./nthprime 46
199
sed -e 's/46##/199#/g'
arquivo de texto inclui algo como isto:
(3505948*51##+331)/56439692311
(2608338*52##+401)/2357853732775
(47723079*50##+773)/7419068507
(67##/16##-1)/40446657668663868225798856758
saída desejada:
(3505948*233#+331)/56439692311
(2608338*239#+401)/2357853732775
(47723079*229#+773)/7419068507
(331#/53#-1)/40446657668663868225798856758
Com
perl
o uso danth_prime
função doMath::Prime::Util
módulo perl (nolibmath-prime-util-perl
pacote no Debian e derivados) para evitar ter que bifurcar um processo e invocar um utilitário externo para cada ocorrência den##
:Se você quiser invocar seu próprio
nthprime
utilitário:Ou armazenar em cache o resultado como uma otimização para evitar executar o comando várias vezes para o mesmo número primo:
O Standard
sed
não tem como executar comandos. O GNU sed faz como extensões não-padrão com seue
comando e oe
sinalizador para os
comando, mas essas são um pesadelo de segurança e também ainda mais ineficientes, pois também executam um shell a cada vez, além do comando¹, então, na minha opinião, é melhor evitá-las.Uma abordagem com utilitários padrão seria gerar
sh
código como:Para alimentar
sh
, o que é quase impossível de fazer com segurança (evitando vulnerabilidades de injeção de comando) e portabilidade. O melhor que posso oferecer:Isso deve ser seguro com o GNU,
sed
que pode lidar com não texto. Em sistemas com umased
implementação diferente, você pode torná-lo mais seguro garantindo que a entrada seja um texto válido removendo os bytes NUL e dobrando as linhas que são maiores que LINE_MAX (e ainda garantir que trabalhamos noC
local e não no do usuário, onde a codificação/decodificação de caracteres pode adicionar mais complicações) com algo como:(não testado)
¹ Exceto em alguns sistemas como o Solaris, onde
popen()
(que é usado pelo comando/sinalizadorsed
do GNUe
) pode otimizar a invocação do shell quando o comando é simples o suficiente, como o Perl faz com seu`cmd`
operador.