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)?

おすすめ記事