使用 Perl 打印功能引用 pb

Quoting pb with the Perl print function

我想grep列表中的一个段落使用2个正则表达式在2个bash变量中的文件,这是我输入的内容:

$ 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:$_

你能帮帮我吗?

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

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

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

来解决

有两个问题:

  • Single-quotes 不要插值。您需要 double-quoted 个字符串、串联等

  • 您生成的 Perl 代码不正确。生成代码很难开始,从 shell 开始只会让事情变得更难。您最终会遇到各种 code injection 错误。不要这样做!而是将数据作为参数(或环境变量)传递。

固定:

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