同时打动两个正则表达式

时间:2012-07-30 21:37:06

标签: regex scripting grep

如何使用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调用来执行此操作,还是应该编写脚本来为我执行此操作?

4 个答案:

答案 0 :(得分:0)

管。 grep expr1 file | grep expr2

for or - egrep '(expr1|expr2)' file

答案 1 :(得分: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的回答。从上面的输入,这将产生 no 输出,所以我怀疑它是你想要的,但如果是,他的答案是相当合理的。另一种选择是类似("My name is.*my bank account" | "my bank account.*My name is")的模式。

答案 2 :(得分:0)

是。有可能的。我用过sed。你可以用你想要的任何东西替换S1和S2

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

Sed比grep复杂得多,在这种情况下,我用它来模拟你想要的grep行为。

答案 3 :(得分: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