回答:
「両方とも同じ行に」とは、「「ライス」の後にランダムな文字が続き、「レモン」またはその逆の場合」を意味します。
正規表現ではrice.*lemon
またはlemon.*rice
です。あなたはそれを使用してそれを組み合わせることができます|
:
grep -E 'rice.*lemon|lemon.*rice' some_file
拡張正規表現(-E
)ではなく通常の正規表現を使用する場合は、|
:の前にバックスラッシュが必要です。
grep 'rice.*lemon\|lemon.*rice' some_file
すぐに少し長くなり、通常はの複数の呼び出しを使用する方が簡単な単語が多いgrep
場合:
grep rice some_file | grep lemon | grep chicken
grep rice
を含む行を検索しますrice
。内に供給されたgrep lemon
だけレモンを含む行を見つけなる...というように。OPは(以前の回答と同様に)[rice | lemon | chicken]のいずれかを許可しています
|
逃げる必要があるのかを説明する心grep
?ありがとう!
egrep
は|
、ORロジックとして理解される拡張正規表現を使用します。grep
基本的な正規表現、デフォルト\|
でOR
grep
のマンページに記載されているとおり、egrep
は廃止されており、に置き換える必要がありますgrep -E
。それに応じて自由に答えを編集しました。
最初のgrepコマンドの出力を別のgrepコマンドにパイプすると、両方のパターンに一致します。そのため、次のようなことができます。
grep <first_pattern> <file_name> | grep <second_pattern>
または、
cat <file_name> | grep <first_pattern> | grep <second_pattern>
ファイルにコンテンツを追加してみましょう。
$ echo "This line contains lemon." > test_grep.txt
$ echo "This line contains rice." >> test_grep.txt
$ echo "This line contains both lemon and rice." >> test_grep.txt
$ echo "This line doesn't contain any of them." >> test_grep.txt
$ echo "This line also contains both rice and lemon." >> test_grep.txt
ファイルに含まれるもの:
$ cat test_grep.txt
This line contains lemon.
This line contains rice.
This line contains both lemon and rice.
This line doesn't contain any of them.
This line also contains both rice and lemon.
それでは、必要なものをgrepしましょう。
$ grep rice test_grep.txt | grep lemon
This line contains both lemon and rice.
This line also contains both rice and lemon.
両方のパターンが一致する行のみを取得します。これを拡張し、出力を別のgrepコマンドにパイプして、さらに「AND」一致を検索できます。
-P
(Perl-Compatibility)オプションと肯定先読み正規表現を使用した(?=(regex))
grep :
grep -P '(?=.*?lemon)(?=.*?rice)' infile
または、代わりに以下を使用できます:
grep -P '(?=.*?rice)(?=.*?lemon)' infile
.*?
する任意の文字に一致し、その後にpattern(または)が続くことを意味します。は、その前にすべてをオプションにします(一致するすべてのものの0回または1回を意味します).
*
rice
lemon
?
.*
(?=pattern)
:ポジティブルックアヘッド:ポジティブルックアヘッドコンストラクトは、括弧のペアであり、開き括弧の後に疑問符と等号が続きます。
両方が含まれているとこれはすべての行を返しますlemon
し、rice
ランダムな順序で。また、これにより|
sとdoubled grep
の使用が回避されます。
grepパイピングソリューションを自動化するスクリプトを次に示します。
#!/bin/bash
# Use filename if provided as environment variable, or "foo" as default
filename=${filename-foo}
grepand () {
# disable word splitting and globbing
IFS=
set -f
if [[ -n $1 ]]
then
grep -i "$1" ${filename} | filename="" grepand "${@:2}"
else
# If there are no arguments, assume last command in pipe and print everything
cat
fi
}
grepand "$@"
eval
簡単に壊れている、それをINGの