Script Perl na pasta que insere um arquivo

1

Eu tenho um script ~/bin/script

$ cat ~/bin/script
#!/bin/bash

perl -pe 's/loremipsum/'cat ~/foo/bar/file.txt'/ge' -i ~/path/to/target.txt

O script deve substituir todas as instâncias de loremipsum in target.txt pelo conteúdo de file.txt . No entanto, a emissão de script retorna

Backticks found where operator expected at -e line 1, at end of line
    (Missing semicolon on previous line?)
Can't find string terminator "'" anywhere before EOF at -e line 1.

O que há de errado com meu roteiro?

    
por Brian Fitzpatrick 25.08.2015 / 05:07

3 respostas

0

Você deve armazenar o resultado do backtick em uma variável de script e usá-lo na chamada perl, como

REPL = 'cat ~/foo/bar/file.txt'
perl -pe "s/loremipsum/$REPL/ge" -i ~/path/to/target.txt

Mas eu acho que seria melhor usar um script perl apenas para substituir a string pelo conteúdo de um arquivo, porque o conteúdo de foo / bar / file.txt pode danificar seu comando.

    
por 25.08.2015 / 06:18
0

Tente isso:

#!/bin/bash

perl -pe "s/loremipsum/'cat ~/foo/bar/file.txt'/ge" -i ~/path/to/target.txt

Parece que você tem problemas com as citações de singles.

    
por 25.08.2015 / 06:18
0

O problema foi resolvido substituindo ~ pelo caminho do seu diretório pessoal.

Ou você pode usar

perl -pe '$thing='cat "$ENV{HOME}/file.txt"';s/loremipsum/$thing/g' target.txt

ou algum outro, mais bonito , que leia primeiro o conteúdo do seu arquivo e substitua a string por esse valor.

sed é outra opção de ferramenta para isso, e ainda tem um comando especial para ler em outro arquivo:

sed '/loremipsum/{
         r file.txt
         d
     }' target.txt

Isso substitui a linha que contém o texto loremipsum com o conteúdo de file.txt .

Dado o arquivo target.txt ,

some text
some text loremipsum
some more text

e o arquivo file.txt ,

This text
is inserted

o comando produziria

some text
This text
is inserted
some more text
    
por 25.04.2018 / 20:58

Tags