繰り返しパターンの繰り返しパターンを見つけるためにgrepする方法は?

繰り返しパターンの繰り返しパターンを見つけるためにgrepする方法は?

テキストファイルFred.txtがあります。

% cat -e fred.txt 
00:$
00:04:$
01:00:23:34$
01:$
01:40:$
01:40:32:$
%

grepを使用して、2桁の数字とコロンを含む行を見つけることができます。

% pcregrep -e '[\d]{2}:' fred.txt   
00:
00:04:
01:00:23:34
01:
01:40:
01:40:32:
%

しかし、パターンの繰り返しパターンを取得しようとすると、見つかりません。

% pcregrep -e '[[\d]{2}:]{2}' fred.txt
%

私は次のような結果を得たいと思います。

% pcregrep -e '[\d]{2}:[\d]{2}:' fred.txt
00:04:
01:00:23:34
01:40:
01:40:32:
%

最終的には、より大きなファイルでより多くのネストされた反復パターンが見つかるので、パターンが繰り返されるたびに定義する必要はありません。このパターンを繰り返す行を見つけるにはどうすればよいですか?

答え1

GNUの使用grep

$ grep -Eo '([0-9]{2}:){2,}' fred.txt 
00:04:
01:00:23:
01:40:
01:40:32:

答え2

[xyz]いわゆる角括弧表現が一致します。一つセット内の文字。ここでは、xyまたはz

[\d]POSIXのデフォルトの正規表現ではorと一致します\が、Perl互換の正規表現では数値dのみが一致するのと同じです。\dたとえば、これを使用して[\da-fA-F]16進数を一致させることができますが、この[\d]場合は使用する方が良いので意味がありません\d

\(...\)ただし、POSIX基本正規表現、(...)POSIX拡張正規表現、またはPCREの必須グループ化では機能しません。

(?:...)逆参照を生成しないこと、逆(?|...)参照の代替番号付けに影響を与えること、(?>...)グループ化演算子の所有バリアントなど、PCREの他のグループ化バリアントがあります。

ここでは逆参照は不要なので、次のものを使用することもできます(?:...)

pcregrep '(?:\d{2}:){2}'

次の行と一致します含む2(2桁の後に1桁:)。次の行を一致させるにははい実際にxこのオプションを追加する必要があります-x

ここでは、

pcregrep '(?:\d\d:){2}'

実際には短いでしょう。

pcregrep '(\d\d:){2}'

同じ効果を持っていますpcregrepが、邪魔しないように指示されていないため、効率がわずかに低下する可能性があります。捕獲中には何が含まれていますか(...)

man pcrepatternPCRE構文の詳細については、参考資料を参照してください。

答え3

使用grep

$ grep -Eo '([^:]*:[[:digit:]]+:?)+' input_file
00:04:
01:00:23:34
01:40:
01:40:32:

関連情報