私の問題の原因は答えはこのリンクにあります、そして追加内容
修正する
つまり、最初のコマンドは理解しますgrep \\[[a-z\|1-9]*\\] file
が、2番目のコマンドの出力はわかりませんgrep \[[a-z\|1-9]*\] file
。
ここで、2番目のコマンドの出力がどのように構成されるのか、特にgrepが3行目と4行目全体を選択しますが、最初の行まで2行目と3行目のみを選択する理由を理解したいと思います。]
ベストアンサー1
あなたの質問に徹底的に答えるには、あまりにも多くの変数と指定されていない仮定があります。
ここで最大のトラップは、シェル(つまり、ほとんどのBourne互換シェル - zshまたはcshとその派生についてはわかりません)が基本的に拡張されていないglobを渡すことです。何も一致しない場合。したがって、まずこのような式を\\[[a-z0-9]*\\]
ワイルドカードとして使用してみてください。もし一致しないファイルの場合(文字以外のすべての単語はリテラルです)、ワイルドカードはそのまま渡され\fno[rd\]
ます。grep
(これをもう一度確認しましょう。これは二重バックスラッシュです。つまり、引用符付きリテラルバックスラッシュの後に2つの左括弧が続きます。最初の文字は最初の文字が2番目の文字の文字クラスを作成します。[
これを正規表現として解析結果は次のように異なりますが、同じように謎です)。
これに対する唯一の合理的な解決策は、シェルによる空白トークン化とワイルドカード拡張を必要としない項目を適切に引用することです。私の提案は、すべての正規表現に一重引用符を使用することです。これにより、特別な努力をすることなく、どのように一致させるかについての合理的な期待を形成することができます。二つパターン(シェル、正規表現)の専門的な解釈です。
正確な一致が必要な場合、正規var[1]
表現は[a-z]*\[[0-9]*\]
同様の操作を実行できます。角かっこを文字クラスの一部として使用するには、最初と2番目が[][a-z0-9]*
文字クラスのリテラルメンバーであることを試してください。これをシェルに渡す場合は、周囲の一重引用符を覚えておいてください。]
[
grep