2012-07-30 20 views
0

如何使用grep同時搜索兩個正則表達式。喂,我找了「我的名字是」,並在像文「我的銀行帳戶」:同時對兩個正則表達式求值

My name is Mike. I'm 16 years old. 
I have no clue how to solve my grep problem,but 
if I manage to solve it, then I'll transfer 
you some money from my bank account. 

我想的grep返回:

我的名字是 我的銀行帳戶

是否有可能只用一個grep調用來完成,還是應該編寫一個腳本來爲我做這件事?

回答

0

如果你不關心一個換行符,只需使用grep

< file.txt grep -o "My name is\|my bank account" | tr '\n' ' ' 

如果你希望一個換行符,使用awk

awk -v RS="My name is|my bank account" 'RT != "" { printf "%s ", RT } END { printf "\n" }' file.txt 
0

管。 grep expr1 file | grep expr2

的或 - egrep '(expr1|expr2)' file

+0

這將僅返回包含兩條線expr1 *和* expr2。海報想要*還是*? – Will 2012-07-30 21:53:59

0

我不太清楚你以後。你給出的結果似乎不適合grep可以/將要做的任何事情。特別是,grep是面向行的,所以如果它在一行中找到一個匹配項,它將在輸出中包含整行。假設這是你真正想要的,你可以or兩種模式一起:

grep ("My name is" | "my bank account") 

鑑於上面的輸入,這應該產生:

My name is Mike. I'm 16 years old. 
you some money from my bank account. 

或者,因爲你還沒有包括的任何薈萃字符在你的模式中,你可以使用fgrep(或grep -F)並將你的模式放在一個文件中,每行一個。對於兩種模式,這可能沒有太大的區別,但是如果你想查找很多模式,它可能會快很多(它使用Aho-Corasick字符串搜索來一次搜索所有模式而不是一次搜索一個)。

另一種可能性是您正在尋找包含my name ismy bank account的單行。這就是@ djechlin的答案會做的。從上面的輸入,這將產生沒有輸出,所以我懷疑這是你想要的,但如果是這樣,他的回答是相當合理的。另一種方法是像("My name is.*my bank account" | "my bank account.*My name is")這樣的模式。

+0

* egrep(填充...) – djechlin 2012-07-30 21:59:14

0

是的。有可能的。我用sed。你可以用你想

sed '/S1/{ s:.*:S1:;H};/S2/{ s:.*:S2:;H};${x;s:\n: :g;p};d' 

無論桑達比grep的要複雜得多替代S1和S2,在這種情況下,我用它來模擬你想要的grep的行爲。