行のどこでもgrep AND関数

行のどこでもgrep AND関数

grepAND関数を実装する方法はありますか?私の言葉はこれです:

次の行があります。

I have this one line
I don't have this other line
I have this new line now
I don't have this other new line
This line is new

grepだから、「new line」だけでなく、「new」と「line」という単語の両方を含む行を探したいと思います。私はこれができることを知っています:

grep new file | grep line

しかし、それは私が探しているものではありません。 1つのコマンドでこれを実行したいと思いますgrep。これは、スクリプトがユーザーに両方の用語を入力するように要求し、いずれかの用語が空である可能性があるため、エラーが発生してスクリプトが中断されるためgrepです。

答え1

空または設定されていない場合は、2番目の項目を実行しないでくださいgrep

grep -e "$term1" <file |
if [ -n "$term2" ]; then
    grep -e "$term2"
else
    cat
fi

これはgrep、呼び出されたファイルのパターンを適用し、空でないかどうかに応じて結果に2番目のパターンを適用するか、パススルーフィルタとして機能します。$term1file$term2grepcat

これは、空のときに「」に変質することを除いて、「term1AND term2」を効果的に実装します。term2term1


まったく実行したくないが、grep2番目の項目が空の場合は空の結果を返す場合:

if [ -n "$term2" ]; then
    grep -e "$term1" <file | grep -e "$term2"
fi

term1これは「AND」を効果的に実装し、nullを「false」term2として扱います。term2

これの利点は、標準にのみ依存し、grep両方のモードが独立して維持されるため、理解して維持するのが簡単であることです。

答え2

これは動作します(GNUを使用grep):

grep -P '(?<=new)\s(?=line)' file

テスト:

$ cat > file
I have this one line
I don't have this other line
I have this new line now
I don't have this other new line
This line is new
^D

$ grep -P '(?<=new)\s(?=line)' file
I have this new line now
I don't have this other new line

答え3

man grep「接続」と「代替」を組み合わせてみてください。

P1=line
P2=new
grep "$P1.*$P2\|$P2.*$P1" file
I have this new line now
I don't have this other new line
This line is new

関連情報