如何在两个不同的行中grep两个变量?

时间:2017-01-12 02:11:13

标签: perl grep

我有一种情况,我需要在包含某些关键字的文件中找到一行,例如,下面我在文件中寻找foo和foobar:

 Line 1 Line 1
 Line 2 foo Line 2
 Line 3 foobar Line 3
 Line 4 Line 4
 etc

并且必须在添加少量字符串后打印两行。 很可能foobar不存在,但foo将永远存在。

他们只会存在一次。

在找到foo和foobar之后,需要进行必要的转换。

grep m%foo%, @lines;
grep m%foobar%,@lines;

2 个答案:

答案 0 :(得分:1)

虽然您可以抓住foofoobar,但目前还不清楚您对结果的处理方式:

grep -noE "foo\w*"

如果你想具体:

grep -noE "foo|foobar"

<强>输出:

2:foo
3:foobar

答案 1 :(得分:1)

你的grep命令运行良好:

my @lines = split ("\n", <<'END');
Line 1 Line 1
 Line 2 foo Line 2
 Line 3 foobar Line 3
 Line 4 Line 4
END

my ($foo) = grep m%foo%, @lines;
my ($foobar) = grep m%foobar%,@lines;

my $res = lc $foo;
$res .= lc $foobar if defined $foobar;
print "$res\n";

恕我直言做grep找到所需的线,然后操纵这些线是一个坏方法。一般模式应该迭代线,匹配正则表达式以收集所需的数据,最后格式化输出。此代码模式适用于90%的文件解析器。

my ($f1, $f2, $fb1, $fb2);
for my $line (@lines) {
    if ($line =~ m/(\d+) foo Line (\d+)/) {
        $f1 = $1;
        $f2 = $2;
    } elsif ($line =~ m/(\d+) foobar Line (\d+)/) {
        $fb1 = $1;
        $fb2 = $2;
    }
}

if (defined $fb1) {
    print "foo and foobar: $f1 $f2 $fb1 $fb2\n";
} else {
    print "Only foo $f1 $f2\n";
}