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
\squando você precisa apenas corresponder a um espaço, basta usar um espaço. - O operador de substituição do Perl entende
$1e, 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