0

grepを使用して2つの正規表現を同時に検索する方法。たとえば、次のようなテキストで「私の名前は」と「私の銀行口座」を探しています。

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に返してもらいたい:

私の名前は私の銀行口座です

1回のgrep呼び出しでそれを行うことは可能ですか、それとも私のためにそれを行うためのスクリプトを書く必要がありますか?

4

4 に答える 4

0

パイプ。 grep expr1 file | grep expr2

または-egrep '(expr1|expr2)' file

于 2012-07-30T21:38:45.243 に答える
0

あなたが何を求めているのかよくわかりません。あなたが与える結果は、grepができる/できることには合わないようです。特に、grepは行指向であるため、行で一致が見つかった場合は、その行全体が出力に含まれます。それが本当に必要なものであると仮定するとor、2つのパターンを一緒にすることができます。

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)を使用して、パターンを1行に1つずつファイルに入れることができます。2つのパターンの場合、これはおそらく大きな違いにはなりませんが、多くのパターンを検索する場合は、おそらくかなり高速になります(Aho-Corasick文字列検索を使用してすべてのパターンを一度に検索します)一度に1つずつ検索する代わりに)。

my name isもう1つの可能性は、との両方を含む単一の行を探していることですmy bank account。それが@djechlinの答えがすることです。上記の入力から、それは出力を生成しないので、私はそれがあなたが望むものであるとは思えませんが、もしそうなら、彼の答えはかなり合理的です。別の方法は、のようなパターンです("My name is.*my bank account" | "my bank account.*My name is")

于 2012-07-30T21:44:54.747 に答える
0

はい。可能です。sedを使用しました。S1とS2を好きなものに置き換えることができます

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

Sedはgrepよりもはるかに複雑です。この場合、Sedを使用してgrepの動作をシミュレートしました。

于 2012-07-30T21:47:59.853 に答える
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 に答える