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

목표를 달성하는 두 가지 방법:

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'

가독성은 떨어지지만 하나만 가능합니다 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

관련 정보