19

我正在使用 Perl 搜索和替换多个正则表达式: 当我执行以下命令时,出现错误:

prompt> find "*.cpp" | xargs perl -i -pe 's/##(\W)/\1/g' -pe 's/(\W)##/\1/g'
syntax error at -e line 2, near "s/(\W)##/\1/g"
Execution of -e aborted due to compilation errors.
xargs: perl: exited with status 255; aborting

拥有多个-e在 Perl 中是有效的,那么为什么这不起作用?有针对这个的解决方法吗?

4

3 回答 3

53

几个-e's 是允许的。

你错过了';'

find "*.cpp" | xargs perl -i -pe 's/##(\W)/\1/g;' -pe 's/(\W)##/\1/g;'

Perl 语句必须以;. 块中的最终语句不需要终止分号。因此,一个-e没有将起作用,但当您有多个语句时;,您将不得不添加。;-e

于 2012-05-03T02:13:48.417 回答
1

拥有多个-e值是有效的,但它有用吗?多个值-e仅组合到一个程序中,由您来确保它们一起构成一个语法正确的程序。该B::Deparse程序可以向您展示perl该程序的想法:

$ perl -MO=Deparse -e 'print' -e 'q(Hello'  -e ')'
print "Hello\n";
-e syntax OK

需要注意的一件奇怪的事情是换行符偷偷溜进去了。想想它是如何到达那里的,看看还有什么其他perl方法可以组合多个-e值。

在您的程序中,您正在替换当前行,然后取修改后的行并再次替换。最好写成:

prompt> find "*.cpp" | xargs perl -i -pe 's/##(\W)/\1/g; s/(\W)##/\1/g'

现在,如果您通过一些自动化过程添加越来越多的内容来构建此命令行,-e并且您不提前知道会得到什么,那么这些可能是-e有道理的。但是,您可能会认为您可以执行相同的操作来构建您提供给的字符串-e。我不知道什么会更好,因为您没有解释为什么要这样做。

但是,我怀疑在某些情况下,人们实际上是在考虑只进行一项替代工作。他们想尝试一种,如果它的模式不起作用,尝试另一种,直到成功。在这种情况下,您不想用分号分隔替换。改为使用短路||s///返回它所做的替换次数,并在||找到真值时停止(短路):

prompt> find "*.cpp" | xargs perl -i -pe 's/##(\W)/\1/g || s/(\W)##/\1/g'

请注意,您只需要一个-p. 它只做一次它的工作。这是具有多个-pdeparsed 的程序:

$ perl -MO=Deparse -i -pe 's/##(\W)/\1/g;' -pe 's/(\W)##/\1/g;'
BEGIN { $^I = ""; }
LINE: while (defined($_ = readline ARGV)) {
    s/##(\W)/$1/g;
    s/(\W)##/$1/g;
}
continue {
    die "-p destination: $!\n" unless print $_;
}
-e syntax OK

这与只有一个相同-p

$ perl -MO=Deparse -pi -e 's/##(\W)/\1/g;' -e 's/(\W)##/\1/g;'
BEGIN { $^I = ""; }
LINE: while (defined($_ = readline ARGV)) {
    s/##(\W)/$1/g;
    s/(\W)##/$1/g;
}
continue {
    die "-p destination: $!\n" unless print $_;
}
-e syntax OK
于 2022-01-29T23:51:46.383 回答
-1

非常感谢!你帮我减少了我的 ascii/十进制/8 位二进制表打印机,足以容纳一条推文:

for i in {32..126};do printf "'\x$(printf %x $i)'(%3i) = " $i; printf '%03o\n' $i | perl \
-pe 's#0#000#g;' -pe 's#1#001#g;' -pe 's#2#010#g;' -pe 's#3#011#g;' \
-pe 's#4#100#g;' -pe 's#5#101#g;' -pe 's#6#110#g;' -pe 's#7#111#g' ; done | \
perl -pe 's#= 0#= #'
于 2022-01-29T02:28:31.287 回答