perl one liner用其他文件替换部分文件

时间:2015-04-27 22:43:23

标签: perl

我对这个班轮有问题:

perl -pe 's/FINDME/`cat rep.txt`/ge' in.txt

如果我像这样使用它,它可以工作,但我也想在替换内容之前和之后添加一些文本:

perl -pe 's/FINDME/SOMETHING1`cat rep.txt`SOMETHING2/ge' in.txt

我收到错误:

syntax error at -e line 1, near "SOMETHING1`cat rep.txt`"

不应该将命令的输出视为字符串吗?

从概念上讲,我也因为我无法替换为角色<

的事实而感到困惑。
perl -pe 's/SOMETHING/<SOMETHINGELSE/ge' in.txt
Unterminated <> operator at -e line 1.

逃离&lt; (\&lt;)给了我同样的错误。

1 个答案:

答案 0 :(得分:1)

问题是你正在使用e修饰符来表示regexp,这意味着将替换字符串作为代码片段进行eval {}(或换句话说,执行),但是你将它视为一个外壳更换。 e修饰符需要CODE,而不是TEXT。

因此,正常(全局)替换将使用:

s/FINDME/REPLACE/g

......这很好。但是,当您使用e标志时,替换将作为代码运行。因此:

s/FINDME/`cat foo.txt`/ge;

......等同于......

$replace = `cat foo.txt`;
s/FINDME/$replace/g;

所以,你可以看到这个:

s/FINDME/SOMETHING`cat foo.txt`/ge;

......等同于......

$replace = SOMETHING`cat foo.txt`;
s/FINDME/$replace/g;

...这显然是语法错误。请尝试这种方式:

s/FINDME/"SOMETHING".`cat foo.txt`/ge;

你会发现它有效,因为这是有效的代码:

$replace = "SOMETHING".`cat foo.txt`;

(你当然可以把更复杂的东西放在那里;因为幕后发生的事情是eval {},你的代码实际上是这样做的:

eval { "SOMETHING".`cat foo.txt`; }
s/FINDME/$_/g;

然而,为了便于理解,我简化了: - )