使用用于查找行

时间:2015-06-01 09:04:09

标签: regex bash perl

我想解析所有* .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);

3 个答案:

答案 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" );

这将:

  • 搜索目录路径下的所有'* .php'文件。
  • 遍历他们寻找你的字符串。
  • 如果存在,请在它之前添加一个新行。
  • 使用新内容写一个'.new'文件(一旦你开心这就行了,你可以互换它们。)