Como passar um caminho para um arquivo através de uma chamada para perl do bash?

1

Esta é uma versão mais avançada de uma pergunta anterior ( Como passar argumentos para perl ao tentar mudar uma linha? ) eu fiz.

Desta vez estou tentando passar um caminho, mas tudo parece que o script em perl está lendo / errado.

Suponha que a linha 4 no arquivo.txt tenha esta aparência

 path_root_abs = "/path/to/thefile"

Para obter o diretório de trabalho e substituí-lo em / path / to / file, fiz

 directory='pwd'
 perl -i -pe "s/(path_root_abs\s=\s\")(.*)(\")/\${directory}$3/ if \$. == 4" file.txt

E tenho:

Bareword found where operator expected at -e line 1, near "s/(path_root_abs\s=\s")(.*)(")/$1/scratch"
syntax error at -e line 1, near "s/(path_root_abs\s=\s")(.*)(")/$1/scratch"
Execution of -e aborted due to compilation errors.

O que devo fazer para evitar unix ler o \ que vem depois do zero como uma bareword.

    
por je_b 11.03.2015 / 00:05

1 resposta

3

O primeiro problema é que $directory contém barras que também estão sendo usadas como o delimitador para o operador de substituição ( s/// ). Basicamente, se $directory for /home/je_b , o que Perl vê é:

 perl -i -pe "s/foo//home/jb/ if \$. == 4" file.txt

Leva o / de /home como o segundo / do operador s/// . A solução mais simples é usar um caractere diferente em vez de / :

perl -i -pe "s#foo#${directory}#" file.txt

Você também pode simplificar de outras maneiras. Considere isto:

perl -pe "s#(path_root_abs = \")(.*)#${directory}\"# if \$. == 4" file
  • Não há necessidade de \s quando você precisa apenas corresponder a um espaço, basta usar um espaço.
  • O operador de substituição do Perl entende $1 e , então use o último e evite escapar.
  • Não faz sentido capturar o caractere " . Se você sabe que está lá, adicione você mesmo.

Finalmente, você também pode obter o pwd do Perl diretamente. Perl tem acesso a todas as variáveis de shell exportadas através do hash %ENV . Então, você poderia apenas fazer:

perl -pe 's#(path_root_abs = ").*#$1$ENV{PWD}"# if $.==1' file
    
por 11.03.2015 / 00:36