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