2015-06-30 142 views
0

行我有短文本字符串的文本文件:比賽正好用兩個比賽

what TIME is it 
what TIME is in X if here it is TIME 

我想找到並打印所有的行這裏所說的``時間「」正好出現兩次。

使用grep很容易找到一個或多個與

grep "TIME" file.txt 

我也試過

grep -E "TIME{2}" file.txt 
awk '/TIME{2}/' file.txt 

,但我只得到空的輸出。可能是什麼問題?這怎麼解決?

我從正則表達式知道的是,當我們使用*,這意味着0或更多的比賽,如果我們用+,這意味着1個或多個匹配。最後,如果我們使用{min,max},那麼您正在尋找最小到最大匹配。使用{N}指示引擎完全返回N個匹配。

+0

你說的「單詞」,但你也說「字符串」,以澄清:如果該行是'abc FOOTIMEBAR def' - 該行顯示TIME有多少次? –

回答

0

awk應該工作:

awk -F 'TIME' 'NF==3' file 
what TIME is in X if here it is TIME 
+1

OP需要TIME兩次。 –

+0

啊謝謝,我現在糾正。 – anubhava

2

這裏是你如何能做到這一點的Perl,其中你算匹配的數量。

#!/usr/bin/perl 

use strict; 
use warnings; 

while (<DATA>) { 
    my @matches = /TIME/g; 
    print if @matches == 2; 
} 

__DATA__ 
what TIME is it 
what TIME is in X if here it is TIME 

給出了這樣的輸出:

what TIME is in X if here it is TIME 
+1

不錯。作爲一個單行,可以是:'perl -ne'打印如果s/TIME/TIME/g == 2'文件' –

1

如果你談論量詞,他們量化模式必須是連續的。要回答你的問題,你最好用類似.*?time.*?time.*的東西,不區分大小寫。

https://regex101.com/r/wD4oT8/3

這意味着time將出現兩次並且它可以包含在任何的時間任一側的信息。請注意,這意味着3個以上的提及仍然有效。

我們可以用同樣的事,但一定要先行在開局就斷言,「時間」沒有被提及兩次以上。 (?!.*time.*time.*time)^.*?time.*?time.*

所看到https://regex101.com/r/wD4oT8/4

+0

我明白了! Paldies :) –

2
$ awk 'gsub(/TIME/,"&")==2' file 
what TIME is in X if here it is TIME