正規表現を短くする方法を知りたいです。

正規表現を短くする方法を知りたいです。

1GB以上のすべてのディレクトリを一覧表示しようとしています。使用できることを知っていますが、ncdu今は正規表現を短縮する方法を理解しようとしています。

このコマンドが見つかりましdu -h . | grep '[0-9\.]\+G'たが、その仕組みを理解できませんでした。

私は正規表現を知る方法で書いてみましたが、これが私が思いついたものです:
du -h . | grep '[0-9]\+\.*[0-9]*G

最初のコマンドは0から9までを検索し、ピリオドを見つけると考えられます。これは\+1つ以上を意味するため、すべての結果は次のようになります。ポイントがない除外しなければならなかったが、そうではなかった。

最初のコマンドはこれではないはずですか? grep '[0-9\.]*G'

ありがとうございます。

ベストアンサー1

まあ、[...]範囲(ロケールによって異なります)に沿ってその中にリストされている単一の文字と一致する角括弧のグループ。[0-9\.]0から9までの数字、バックスラッシュ、またはドットと一致します。おそらくドットをエスケープする必要があると思ったので、そこにバックスラッシュを追加しました。ただし、角かっこグループ内ではそうではありません。

標準 BRE (基本正規表現) では\+定義されていないため、正規表現は事実上無効です。 GNUシステムでは、+拡張正規表現(ERE)のように動作し、前の正規表現と一致します。他のシステムでは他のタスクを実行することもできます。Gテキストのみが一致しますG

ここでは、GNU固有の式を使用する理由はありません。これは標準EREで書き直され、grepにBREの代わりにそれを使用するように指示できるからです。そうかもしれない

grep -E '[0-9.]+G'

少なくとも1つの数字または点の後にGが表示されます。

最初のコマンドは0から9までを探し、次にピリオドを見つけるようです。

いいえ、角かっこ式には順序がありません。[xyz.]同じです[z.yx]。この場合、ドット[0-9]\.が続く単一の数字を探します。 (ここでは点をエスケープする必要があります。)

最初のコマンドはこれではないはずですか?grep '[0-9\.]*G'

これは数字(または点)をオプションにし、一致します。実際、元のテキストの "one or more"Gは式が先頭に固定されていない[0-9.]Gため必要ありません。またはポイント)も暗黙的に許可されます。 (つまり、123G一致し3G、grepはまだ全体の行を印刷します。)

[0-9]一致できる文字はではなく0123456789、数値によってソートされた他の文字がある場合、ロケールのソート順序によって異なります。)


duディレクトリサイズと名前を含む出力の場合、grepは1Gパス名に含まれるすべての行と一致します。また、duサイズをTBなどで印刷できる場合は、同じサイズの行を見逃す可能性があります1.2T。これを防ぐには、式を行の先頭に固定し、少なくとも以下を追加する必要がありますT

du -h . | grep -E '^[0-9.]+[GT]'

+(行の先頭とorの間に単一の数字(またはドット)のみを見つけるため、これが必要です^[0-9.][GT]GT1G1.2G

または、たとえば、次のようにします。

du -h . | awk '$1 ~ /[GT]/'

(実際に数字を見つける必要はありません。私たちは数字がそこにあることを知っています。)

おすすめ記事