2017-01-12 98 views
0

我有一個情況我需要找到其中包含例如某些關鍵字,下面我正在尋找一個文件foo和foobar的一個文件中的行:如何grep兩個不同的行中的兩個變量?

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

爲什麼不只grep for foobar?如果它只存在一次? – merlin2011

+0

我需要grep for foo,如果它有那麼做一些操作並添加到輸出,如果foobar也存在,那麼它也會添加到輸出中。 – MikasaAckerman

+0

你在你的問題中說「foo」總是存在,merlin2011提到的真的是完全有效的。所有你需要檢查的是foobar ... –

回答

1

目前還不清楚你用結果做什麼,但你可以抓住兩個foofoobar

grep -noE "foo\w*" 

如果要具體:

grep -noE "foo|foobar" 

輸出:

2:foo 
3:foobar 
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"; 
} 
相關問題