如何通过从 bash 调用 perl 将路径传递给文件?

如何通过从 bash 调用 perl 将路径传递给文件?

这是上一个问题的更高级版本(尝试更改行时如何将参数传递给 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

相关内容