我要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:$_
你能帮我吗?
答案 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)
来解决此问题。