如何使用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 :(得分: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 is
和my 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