grep
文字列にRHと2文字(両方ともAとZの間の文字)が含まれるように正規表現RH [A-ZA-Z]を一致させるにはどうすればよいですか?
私は成功せずにこれを試しました。
yum list-security --security | awk '{print $1}' | sort | uniq | grep RH[A-ZA-Z]
Loaded
RHEA-2014:1307
RHSA-2014:1326
RHBA-2014:1388
RH@A-2014:1389
RHSA-2014:1392
RHSA-2014:1389
RH7A-2014:1392
RHSAA-2014:1389
RHMAW-2014:1392
これが私が期待するものです:
RHEA-2014:1307
RHSA-2014:1326
RHBA-2014:1388
RHSA-2014:1392
RHSA-2014:1389
答え1
RH[A-ZA-Z]
同じ文字セットを 2 回繰り返す単一文字クラスを含む正規表現です。 fromRH
の後に続くすべての文字と一致します。 4番目の文字に制限はなく、4番目の文字も必要ありません。A
Z
明らかに、これは所望の効果を得ることができない。
これを試してみてください:RH[A-Z][A-Z]
または(拡張子grep -E
またはPerlgrep -P
正規表現を使用)RH[A-Z]{2}
また、シェルがグローバル変数に拡張されないように、正規表現の周りに一重引用符(または変数またはコマンド置換を含める必要がある場合は二重引用符)を含めることをお勧めします。現在のディレクトリ名にファイルがある場合、RHAA
シェルは引数を RHAA に拡張します。みんなあなたはgrep
見ることができます:
$ grep RH[A-Z][A-Z] yael.txt | wc -l
7
$ touch RHAA
$ grep RH[A-Z][A-Z] yael.txt | wc -l
0
以下と同じ:
$ grep RHAA yael.txt | wc -l
0
しかし、状況はさらに悪化しました。 「RHAB」というファイルもある場合、grep
コマンドラインは次に展開されます。
grep RHAA RHAB yael.txt
grep
したがって、正規表現は、標準入力および/または検索される名前付きファイルだけでなく、ファイルからも検索されます。RHAA
RHAB
代わりに引用したgrepを使用してください。grep 'RH[A-Z][A-Z]'
修正する:
後ろに2文字だけ(ただし2つ以下)にRH
従うには、代わりに次のように使用します。[A-Z]
grep 'RH[A-Z][A-Z][^A-Z]' yael.txt
3番目の文字クラスは、クラスを否定または反転する[^A-Z]
ことから始まります。^
つまり、どの文字にも一致します。とは別に A
到着するZ
。
どのバージョンの正規表現を使用しても、一致を行の先頭に固定したいと思います。あなた^
も使用できますが、外では全く異なる意味を持ちます[]
。これがスタートアンカーポイントです。たとえば、次のようになります。
grep '^RH[A-Z][A-Z][^A-Z]' yael.txt
行のみ一致スタートそしてRH[A-Z][A-Z][^A-Z]
、そして意志いいえ線を他の場所の対応するパターンと一致させます。