我想解析所有* .php文件,以及每行如
$res = $DB -> query($queryVar);
我需要得到:
file_put_contents('php://stderr', print_r($queryVar, TRUE));
$res = $DB -> query($queryVar);
变量$ queryVar的名称可能会改变!我需要从代码中获取它!
我最初的想法:
find -not -path "*/\." -name "*.php" -type f -print0 | xargs -0 sed -i 's,SOMETHING,SOMETHING,'
但似乎无法使用sed获取查询变量的名称。
我也开始关注Perl:Perl: append a line after the last line that match a pattern (but incrementing part of the pattern)
但我只能做到这一点:
perl -pe 's/(-> query\(.*\))/AAAAA $1 AAAAA\n$1/' < filename.php
有两个问题:我得到标准输出的结果,我需要像sed这样编辑原始文件,因为我将从find | xargs
调用它,无论如何我得到整个找到的行而不仅仅是变量:
$res = $DB AAAAA -> query( $SQL) AAAAA
-> query( $SQL);
答案 0 :(得分:1)
给定名为filename.php
的文件,您可以运行以下命令:
perl -pi -e 's/^(.+-> query\((.+?)\).*)$/file_put_contents\("php:\/\/stderr", print_r\($2, TRUE\)\);\n$1/;' filename.php
它将使用您要执行的替换来就地更新文件。
答案 1 :(得分:1)
您可以使用perl的-i
标志来编辑文件。
要仅捕获查询变量,您需要在()
部分中添加捕获组,如下所示:
perl -i -pe 's/^(.*-> query\((.*)\);)$/inserted_code_here($2);\n$1/' x.php
然后在查询调用之前将inserted_code_here
替换为您要放在行上的任何内容。
答案 2 :(得分:0)
您可以perl
使用sed
。但实际上,通过这样做,你会丢掉很多作为语言的潜力。我无法从你的问题中得知 - $queryVar
是一个文字,还是你需要替换的变量?
为什么不试试这个:
#!的/ usr / bin中/ perl的
use strict;
use warnings;
use File::Find;
sub process_php {
next unless m/\.php$/;
open( my $input, "<", $File::Find::name ) or warn $!;
open( my $output, ">", $File::Find::name . ".new" )
or warn $!;
while ( my $line = <$input> ) {
my ($query_id) = ( $line =~ m/-> query\((.*)\))/ );
if ($query_id) {
print {$output} "file_put_contents('php://stderr', print_r(",
$query_id, " TRUE));\n";
}
print {$output} $line;
}
close($input);
close($output);
}
find( \&process_php, "/path/to/php/files" );
这将: