私の問題の原因は答えはこのリンクにあります、そして追加内容
修正する
つまり、最初のコマンドは理解します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
答え2
ゆっくり行こう次の内容を含むファイルがある場合(表示しやすいように1行のみを使用):
$ cat infile
list[1]; i[ab1]; var[1] [1]var [1]var[2]
ㅏ
Simple はgrep --color a
すべての a を赤で表示します。 (サイトでカラーコントロールを許可するため、太字が赤であると仮定):
$ grep --color a infile
list[1]; i[
ㅏb1]; v
ㅏr[1] [1]v
ㅏr [1]v
ㅏr[2]
aが(上記のように)引用されていないか引用されていても、同じことが起こります。
$ grep --color \a infile
list[1]; i[
ㅏb1]; v
ㅏr[1] [1]v
ㅏr [1]v
ㅏr[2]
$ grep --color "a" infile
list[1]; i[
ㅏb1]; v
ㅏr[1] [1]v
ㅏr [1]v
ㅏr[2]
$ grep --color 'a' infile
list[1]; i[
ㅏb1]; v
ㅏr[1] [1]v
ㅏr [1]v
ㅏr[2]
なぜ?なぜなら両方:
- シェルには特別なものはありません。
- シェルは引用符を削除し、grepは
a
最初の引数と同じ内容を受け取ります。バックスラッシュ引用符、二重引用符、または一重引用符。
]
中かっこを選択するには]
(閉じる中かっこから始めます):
$ grep --color ] infile
list[1
]; i[ab1
]; var[1
][1
]var [1
]var[2
]
]
参照(すべてを参照)がある場合でも同じことが発生します。
この場合、]
シェルに特別ですが、一致するオープン中括弧がない場合はそうではありません。
閉じた中括弧の場合、状況はより複雑になります。これらすべてのエラーは次のとおりです。
grep --color [ infile
grep --color '[' infile
grep --color "[" infile
なぜ? grepで受け取ったコンテンツのためみんな事件は珍しい[
。
この単純なエコーにより、シェルが何をしているかを確認できます。
$ echo \[ "[" '['
[ [ [
シェルは最初のレベル参照を削除し、すべての値は同じように見えます。
[
しかし、grepが得ようとしているのは、実際に検索する文字が[
バックスラッシュで囲まれた角括弧(\[
)であることを理解することです。これはすべて起こります。
$ echo \\[ "\[" '\['
\[ \[ \[
grep は次のいずれかで使用できます。
$ grep --color \\[ infile
list
[1]; i
[ab1]; var
[1]
[1]var
[1]var
[2]
[[]
(単一の文字のみを含む文字のリスト)を使用すると、[[]
同じ結果を得ることができます(引用符がある限り)。
$ grep --color '[[]' infile
list
[1]; i
[ab1]; var
[1]
[1]var
[1]var
[2]
[[]
Grepが正しく機能するには、正確な受信が必要です。引用符が必要ないようです。
$ echo \[\[\] "[[]" '[[]' [[]
[[] [[] [[] [[]
ただし、次のファイルを作成すると、[
このアイデアは壊れます。
$ touch \[
$ echo \[\[\] "[[]" '[[]' [[]
[[] [[] [[] [
それは[
殻に特別なためです。シェルの場合、ファイル名グロービングモードを有効にします。 1 つ以上のファイルがパターンと一致すると、ファイルのリストが置き換えられます。
したがって、以下は正しく機能します。
$ grep --color '[[]' infile
list
[1]; i
[ab1]; var
[1]
[1]var
[1]var
[2]
そしてこれは:grep --color '[]]' infile
閉じる中括弧と一致します。
[][]
左角かっこ一致そして閉じ括弧内には、特定の文字シーケンス(もちろん引用符を含む)が必要です。
これを試してみると:
$ grep --color '[[]]' infile
ゲームはまったくありません。動作するには、次のものが必要です。
$ grep --color '[][]' infile
list
[1
]; i
[ab1
]; var
[1
][
1
]var
[1
]var
[2
]
この特定の順序で閉じる中括弧は、文字範囲の最初の文字でなければなりません。開く中括弧は、文字リストの最後の文字でなければなりません。
[]a-z0-9[]
その後、追加の文字を追加できます(それ以上は追加できません;
)。
$ grep --color '[]a-z0-9[]' infile
リスト[1];
私[ab1];
変数[1][1]変数
[1]変数[2]
|
その後、範囲内に欠落しているアイテムを追加して、公開したリンクと一致させることができます。そのリンクの正規表現はこことは異なり、非常に異なる方法で動作します。 oneと他の文字を一致させることで始まり、[
終端文字で終わります]
。次のようなもの(貪欲な性格がライン*
全体を占める):
$ grep --color '\[.*\]' infile
list
[1];i[ab1];変数[1][1]変数[1]変数[2]
または、次のようになります。
$ grep --color '[[][a-c0-9]*[]]' infile
list
[1]; i
[ab1]; var
[1][1]
var
[1]var
[2]`