テキストファイル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]
いわゆる角括弧表現が一致します。一つセット内の文字。ここでは、x
、y
または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 pcrepattern
PCRE構文の詳細については、参考資料を参照してください。
答え3
使用grep
$ grep -Eo '([^:]*:[[:digit:]]+:?)+' input_file
00:04:
01:00:23:34
01:40:
01:40:32: