Grep は括弧内の数値範囲を探します。

Grep は括弧内の数値範囲を探します。

かっこ内の一連の数字だけを探そうとします。現在、grepは括弧内のすべてを取得しますが、これを[0001-9999]行うにはgrepをどのように変更する必要がありますか?

いくつかの他のバージョンを試しましたが、(?<=\()[0001-9999](?=\))何も返しませんでした。

$ cat /tmp/output
This is R3trans version 6.26 (release 745 - 24.03.17 - 20:17:03).
R3trans finished (0000).
R3trans finished (0001).
R3trans finished (9999).
05.03.2018 16:30:02
enserver, EnqueueServer, RED, Running, 2018 02 27 09:15:52, 151:14:10, 19069

電流出力

$ cat /tmp/output | grep -Po '(?<=\().*(?=\))'
release 745 - 24.03.17 - 20:17:03
0000
0001
9999

希望の出力

$ cat /tmp/output | grep -Po '(?<=\().*(?=\))'
0001
9999

答え1

目標を達成する2つの方法:

grep方法(一緒に真珠サポートする):

grep -Po '\(\K(?!0000)([0-9]{4})(?=\))' /tmp/output

牛に似た一種の栄養awk方法:

awk -v FPAT='\\([0-9]{4}\\)' '$1{ n = substr($1,2,4); if (int(n) > 0) print n }' /tmp/output

出力:

0001
9999

答え2

明らかに数値的な制限があります。それでは、プログラミング言語を使用するのはどうでしょうか?例:

perl -nE '/\((\d{4})\)/ and $1 > 0 and say $1'

答え3

これはうまくいくようです:

grep -Eo '[0-9]{4}' /path/to/file | grep -v '0000'

読みやすさは低下しますが、1つだけ可能ですgrep

grep -Eo '[0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]|[0-9][1-9][0-9]{2}|[1-9][0-9]{3}' /path/to/file

関連情報