我对这个班轮有问题:
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;)给了我同样的错误。
答案 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;
然而,为了便于理解,我简化了: - )