以下を含む「test」というファイルがあります。
linux
Unixlinux
Linuxunix
it's linux
l...x
これで:を使用すると、grep '\<l.*x\>'
次のようになります。
linux
it's linux
l...x
ただし、を使用すると、grep '\<l*x\>'
次のように一致します。
l...x
ただし、リファレンスガイドによると、*を使用すると、前の項目が0回以上一致します。つまり、「l」で始まり「x」で終わるものと一致する必要があります。
期待した結果が表示されない理由を説明できる人はいますか?それとも私が間違って理解していますか?
答え1
シンボル(.*)
正規表現の * と * は、文字当たりの文字数ではなく、数を意味し、より正確には意味します。「0個以上」。また、。方法「すべての単一文字」。
だからそれらを合わせると「0個以上の文字があります。」。たとえば、次の文字列は次のようになります。
- Linux
- リンNx
- lnx
- ハイLinux
- ラックス
と一致します<l.*x>
。最後の項目が重要であることを示します。.*やはり一致できません。
シンボル(*)
私が言ったように、*だけがカウンターです。したがって、文字の後に入れると、次のようになります。「エル」*言う「0個以上のl」。
grep は と一致しますが、考え方とl*x
異なるl...x
場合があります。
% echo "l...x" | grep "l*x"
l...x
末尾の「x」と一致します。 「l」は、「x」の前に「x」があることを除いて、一致理由とは何の関係もありません。「0個以上のl」。
答え2
「l」で始まり、「x」で終わるすべての項目を一致させるには、正規表現「l.*x」を使用します。ここで「。」 「*」および「*」は、それぞれ有効な単一文字と長さが0以上の文字を表す特殊文字です。ここで「*」の前には「.」があるので、「.」を置き換えることができる項目は何でも可能です。上記の「*」定義に従って繰り返します。
答え3
シェル(bashなど)の場合、clownはファイル名を一致させるために使用され、文字自体の場合は文字を表します*
。?
一方、正規表現の場合、、、*
(発生範囲)および(のみ)?
はそれ自体では何もありません。常に前の文字/原子を参照してください。実際の文字(例えば、または)であるかどうかにかかわらず、(ジョーカー)は、すべての文字、文字範囲(たとえば)、または複数の文字のパターン(egrepのみです。 。したがって、それ自体は何の意味もありませんが、前の文字(1つの単位と見なされる人またはグループの道化師かもしれません)が何回繰り返されるべきかを教えてください。{n,m}
+
egrep
L
5
.
[a-f]
(abba)
*
?
*
シェルと正規表現の使用方法の違いを覚えておくと?
わかります。
したがって、正規表現の場合:
.
- すべての文字の正確に一度の発生を示します。a..a
- 2つのaとその間のすべてのタイプの2つの文字に一致します。.*
- すべての文字が0個、1個以上一致します。B*
- 「B」が0、1個以上一致します。