*
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
が、エスケープ括弧内にあるので、一致するすべての文字をとして引用することができます。\1
とfoofoo
一致させます。\(.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.txt
a
同様に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 this
group:を使用しますfind\( this\)\?
。