使用grep和regex检测没有ID属性的字段

时间:2014-12-11 07:17:06

标签: regex perl grep

需要使用grep和正则表达式在文件中找到以下模式: -

        $form->AddFields({
            type => 'hidden',
            name => 'xyz',
            value => 0,
        });

我认为我们需要使用多行grep。 任何人都可以帮忙。?

2 个答案:

答案 0 :(得分:4)

使用awk:

awk '{ printf /id =>/? FS: $0 RS}' RS='});' file

输入:

$form->AddFields({
    id => 2048
    type => 'hidden',
    name => 'xyz',
    value => 0,
});

$form->AddFields({
    type => 'hidden',
    name => 'xyz',
    value => 0,
});

$form->AddFields({
    type => 'hidden',
    name => 'xyz',
    id => 1024,
    value => 0,
});

输出:

$form->AddFields({
    type => 'hidden',
    name => 'xyz',
    value => 0,
});

答案 1 :(得分:0)

它不是grep语句,但可能想尝试这个Perl脚本(假设您通过STDIN提供输入)。它还假设您没有在输入中截断的任何形式(在输入结束之后输入开始或结束之前开始的形式),但是如果它们是那么处理这些条件的方法与你相关。

use strict;
use warnings;


sub processRecord {
  my ($record) = @_;
  my $text = join("\n", @{$record});
  print "$text\n" unless $text =~ /ID\s*=>\s*/;
}


my $recordStart = qr/^\s*\$form\s*->\s*AddFields\s*\(\s*\{\s*/;
my $recordEnd = qr/\s*\}\s*\)\s*;\s*$/;
my @record;
my $inRecord = 0;
while (my $line=<>) {
  next unless $line =~ /\S/;
  chomp($line);
  $inRecord = 1 if $line =~ /$recordStart/;
  if ($line =~ /$recordEnd/) {
    push(@record, $line);
    processRecord(\@record);
    @record = ();
    $inRecord = 0;
    next;
  }
  push(@record, $line) if $inRecord;
}