用Perl打印功能引用pb

时间:2019-05-24 14:58:22

标签: bash perl printf quoting

我要grep的列表中的段落使用2个bash变量中的2个regexp文件,这是我输入的内容:

$ startRegExp=function.toto
$ endRegExp=^}
$ set -x
$ perl -ne "print '\$ARGV:\$_' if /$startRegExp/ ... /$endRegExp/" .bash_functions*

但这就是我得到的:

+ perl -ne 'print '\''$ARGV:$_'\'' if /function.locate/ ... /^}/' .bash_functions .bash_functions.AV .bash_functions.Darwin .bash_functions.Debian .bash_functions.Linux .bash_functions.build .bash_functions.mpv .bash_functions.ytdl
$ARGV:$_$ARGV:$_$ARGV:$_$ARGV:$_$ARGV:$_$ARGV:$_$ARGV:$_$ARGV:$_$ARGV:$_$ARGV:$_$ARGV:$_$ARGV:$_$ARGV:$_$ARGV:$_

你能帮我吗?

2 个答案:

答案 0 :(得分:2)

有两个问题:

  • 单引号不会插值。您需要双引号字符串,串联等。

  • 您错误地生成了Perl代码。从一开始就很难生成代码,而从shell生成代码只会使其变得更加困难。您最终会遇到各种code injection错误。不要这样!而是将数据作为参数(或环境变量)传递。

已修复:

perl -sne'print "$ARGV:$_" if /$s/.../$e/' -- \
   -s="$startRegExp" -e="$endRegExp" bash_functions*

答案 1 :(得分:1)

Perl中的单引号不会插入变量。通过环境将变量发送到脚本,以便它们成为一等公民,您可以在其中使用任何字符:

s=$startRegExp e=$endRegExp perl -ne 'print "$ARGV:$_" if /$ENV{s}/ ... /$ENV{e}/'

请注意,如果文件不包含结尾的},perl将继续打印下一个文件。可以通过将右范围操作数更改为(/$ENV{e}/ || eof)来解决此问题。