这是上一个问题的更高级版本(尝试更改行时如何将参数传递给 perl?) 我做了。
这次我试图传递一条路径,但似乎 perl 脚本在 / 中的读入错误。
假设 file.txt 中的第 4 行如下所示
path_root_abs = "/path/to/thefile"
为了获取工作目录并将其替换为 /path/to/file 我做了
directory=`pwd`
perl -i -pe "s/(path_root_abs\s=\s\")(.*)(\")/\$1${directory}$3/ if \$. == 4" file.txt
并得到:
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.
我应该怎么做才能避免unix将scratch后面的\作为裸字读取。
答案1
第一个问题是$directory
包含斜杠,斜杠也被用作替换运算符 ( s///
) 的分隔符。基本上,如果$directory
是/home/je_b
,Perl 看到的是:
perl -i -pe "s/foo//home/jb/ if \$. == 4" file.txt
它将/
of作为运算符的/home
第二个。最简单的解决方案是使用不同的字符而不是:/
s///
/
perl -i -pe "s#foo#${directory}#" file.txt
不过,您也可以通过其他方式进行简化。考虑一下:
perl -pe "s#(path_root_abs = \")(.*)#\1${directory}\"# if \$. == 4" file
\s
当你只需要匹配一个空格的时候就不需要了,只用一个空格即可。- Perl 的替换运算符理解两者
$1
,\1
因此使用后者并避免转义。 - 捕捉角色没有任何意义
"
。如果您知道它在那里,请自行添加。
最后,您还可以pwd
直接从 Perl 获取。 Perl 可以通过散列访问所有导出的 shell 变量%ENV
。所以,你可以这样做:
perl -pe 's#(path_root_abs = ").*#$1$ENV{PWD}"# if $.==1' file