Utilizando perl para substituir uma string pelo conteúdo do arquivo encontrado em uma matriz

0
for i in "${arrOfFiles[@]}"; do
   # OUTPUT_PATH=some dynamic naming file created earlier
   perl -pe 's/%REPLACE ME%/'cat $i'/ge' -i "$OUTPUT_PATH"'
done

Meu script desliga aqui e nunca termina. usar cat $i revela o conteúdo correto do arquivo da matriz, então $ i está funcionando. O que dá?

    
por Maverick 01.02.2017 / 04:27

1 resposta

0

Você não deseja usar o sinalizador e para o operador s/// do perl. -e avalia o lado direito da substituição como código perl; você não quer avaliar o conteúdo de cat $i como código perl, você quer que ele seja tratado como texto literal para substituir. Como você está usando aspas simples na linha de comando bash, o texto cat $i é passado literalmente para perl e é avaliado como uma expressão : o que significa que perl executa um subshell para cat e o conteúdo (na mente do perl) de $i - que não é uma variável perl . Sem use strict , é totalmente legal ter uma variável não declarada, então o perl não reclama quando você diz para ele abrir uma subshell que chama cat sem argumentos. cat sem argumentos, claro, apenas aguarda stdin .. é por isso que você vê o script "travar". Você está essencialmente chamando isso:

perl -e ''cat $i';'

Seu erro é evidente se você adicionar use strict ao seu código perl:

perl -e 'use strict; 'cat $i';'

Seu bloco de código deve ser este:

for i in "${arrOfFiles[@]}"; do
    perl -pi -e "s/%REPLACE ME%/'cat $i'/g;" "$OUTPUT_PATH"
done

Observe, no entanto, que isso sempre funcionará no arquivo denominado em $OUTPUT_PATH , o que significa que o texto %REPLACE ME% dentro dele será substituído pelo conteúdo do primeiro arquivo em sua matriz de arquivos e, em seguida, nenhum o resto dos arquivos irá substituir qualquer coisa. Não está claro o que exatamente você está tentando fazer aqui. Com os -pi flags para perl, você está dizendo para editar in-line qualquer um / todos os arquivos fornecidos na linha de comando, que atualmente é apenas $OUTPUT_PATH .

Também é provavelmente uma maneira geralmente ruim de fazer a substituição de strings - provavelmente há um grande número de caracteres no conteúdo de cada arquivo $i que pode explodir totalmente sua linha de comando perl. Um único caractere / será suficiente para causar um erro de sintaxe perl, e provavelmente existem seqüências que executariam código arbitrário via injeção. Você foi avisado.

    
por 01.02.2017 / 19:46

Tags