grepはワイルドカードグループ化を使用して、一致せずにファイル全体を印刷します。

grepはワイルドカードグループ化を使用して、一致せずにファイル全体を印刷します。

*grepを使用して角括弧でグループ化するか、同じワイルドカードと組み合わせると、ファイル全体が?印刷されますが、一致するものは強調表示されません。しなければならない発見されました。

test.txt:

find this
asdffind this
find this asdf
sadffind thisasdf
(find this)
(find this)?

grep -in "find this" test.txt:
これを見つけた
アスダフこれを見つけた
これを見つけたシリア
防衛軍これを見つけたアスダフ
これを見つけた)
(これを見つけた)?

grep -in "\(find this\)" test.txt:
これを見つけた
アスダフこれを見つけた
これを見つけたシリア
防衛軍これを見つけたアスダフ
これを見つけた)
(これを見つけた)?

grep -in "\(find this\)\?" test.txt:
これを見つけた
   これを見つけた<--なぜfind this一致しないのですか?
asdfffind this <--なぜfind this一致しないのですか?
これを見つけたasdf
Sadffind thisasdf <--なぜ一致しないのですかfind this
(検索)<--なぜfind this一致しないのですか?
(これを見つけてください)? <--なぜfind this一致するものがないのですか?

?行の先頭から始まる構文だけを探します。このキャラクターも同じだ*

?ワイルドカードを適用しようとしています。完全なフレーズ。括弧がない場合は、その単語を含む最後の単語にのみ適用されます。そうですか?
grep "find this\?"Only works ?thisこれは私が望むものではありません。

編集する:

私の問題は、「フレーズ」を個々の単語として扱おうとしても機能しないことです。

答え1

あなたの問題は、グループ化を無効にするために角かっこをエスケープする必要があると思うことです。実際、角かっこをエスケープすることでグループ化が可能になります。たとえば、一致する行だけを印刷するには、次のように(find this)します。

$ grep -in "(find this)" test.txt
5:(find this)
6:(find this)?

括弧 ( \( \)) をエスケープすると、 と が通常の文字として扱われgrepず、特殊な「グループ」区切り文字で処理されることを意味します。たとえば、次のことができます。()

$ echo "foofoo" | grep -o '\(.oo\)\1'
foofoo

2つのOs()は後に続くすべての文字と一致します.ooが、エスケープ括弧内にあるので、一致するすべての文字をとして引用することができます。\1foofoo一致させます。\(.oo\).*\1

にも同様に適用されます?。正規表現のワイルドカード(例:)に従わない限り、これは.一般的な文字です。したがって、その行のみを一致させるには、(find this)?次のようにします。

$ grep -in "(find this)?" test.txt
6:(find this)?

答え2

実際に何をしたいのかわかりません(あなたの説明は言葉ではありません)、あなたが下したコマンドが何であるかを説明するだけに答えます。説明で述べたように、古いバージョンのgrepでエラーが発生する可能性があります。最新バージョン(最新のLinuxディストリビューションやHomebrewなど)を試してください。

Grep は、指定されたパターンに一致する行を検索します。 grepの出力は、ラインのどの部分が一致するかに関係なく、全体のラインです。 (このオプションは-oこれを変更します。)たとえば、含まれているgrep a test.txtすべての行を印刷しますa。それだけでなく、全体のラインa

特に、パターンが空の文字列と一致できる場合、grepはすべての行を印刷します。たとえば、Sinceは空の文字列を含む行を含むすべての行を\?印刷する0または1の演算子です。すべての行に空の文字列が含まれているため、すべての行が印刷されます。grep 'a\?' test.txta

同様にgrep "\(find this\)\?"、文字列を含むか空の文字列を含むすべての行を印刷するので、すべての行を印刷します。find thisこの演算子は\?グループに適用されますfind this(grepのデフォルトの正規表現構文では、バックスラッシュ角括弧はグループを区切ります)。

強調表示は、行一致アクションの上部に適用されます。行を一致させる方法が複数ある場合、ドキュメント(GNU grep 2.25に基づいて)で可能であれば、null以外の一致が使用されることを指定しない限り、grepが一致を考慮する部分は指定されません。私の考えでは、GNU grepは最も長い一致を使用しているようです。

演算子は「単語」には適用されません。以前に適用されます。特徴またはかっこ内のグループ。たとえば、find this\?「どちらかfind this」を意味しますfind thi\?演算子は最後の演算子にのみ適用されますs。またはfindを一致させるには、find thisgroup:を使用しますfind\( this\)\?

関連情報