我正在寻找一个Perl oneliner(将其插入Bash脚本),我需要下一个界面:
perl -0777 -nlE 'commands' file1 file2 .... fileN
我创建了下一个:
perl -0777 -lnE 'BEGIN{$str=quotemeta(do{local(@ARGV, $/)="file1"; <>})} say "working on $ARGV" if $_ =~ /./' "$@"
更漂亮:
perl -0777 -lnE '
BEGIN{
$str = quotemeta(
do{
local(@ARGV, $/)="file1"; <> #localize ARGV to "file1.txt" for <>
}
)
}
say "working on $ARGV" if $_ =~ /./ #demo only action
' "$@"
虽然有效,但有了这个,我需要在每次需要更改file1
时编辑源代码。
如何将脚本更改为以下内容?
$ARGV[0]
(file1)粘贴到$str
(在BEGIN区块中)$_
答案 0 :(得分:4)
将其作为参数传递,将其从@ARGV
块中的BEGIN
中删除。
$ echo foo >refile
$ echo -ne 'foo\nbar\nfood\nbaz\n' >file1
$ echo -ne 'foo\nbar\nfood\nbaz\n' >file2
$ perl -lnE'
BEGIN {
local @ARGV = shift(@ARGV);
$re = join "|", map quotemeta, <>;
}
say "$ARGV:$.:$_" if /$re/;
close(ARGV) if eof; # Reset $.
' refile file1 file2
file1:1:foo
file1:3:food
file2:1:foo
file2:3:food