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 调用来完成它,或者我应该编写一个脚本来为我做这件事?

4

4 回答 4

0

管道。 grep expr1 file | grep expr2

对于或 -egrep '(expr1|expr2)' file

于 2012-07-30T21:38:45.243 回答
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 is另一种可能性是您正在寻找包含和的单行my bank account。这就是@djechlin 的回答。从上面的输入来看,这不会产生任何输出,所以我怀疑这是你想要的,但如果是的话,他的回答是相当合理的。另一种选择是像("My name is.*my bank account" | "my bank account.*My name is").

于 2012-07-30T21:44:54.747 回答
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
于 2012-07-30T23:13:15.123 回答
0

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

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

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

于 2012-07-30T21:47:59.853 回答