我有一种情况,我需要在包含某些关键字的文件中找到一行,例如,下面我在文件中寻找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;
答案 0 :(得分:1)
虽然您可以抓住foo
和foobar
,但目前还不清楚您对结果的处理方式:
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";
}