grep을 사용하여 문자열에서 지정된 (범위) 길이를 얻는 방법은 무엇입니까?

grep을 사용하여 문자열에서 지정된 (범위) 길이를 얻는 방법은 무엇입니까?

여기에 bash "one-liner"가 있습니다. cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 16 | head -n 16 | grep '[0-9]'이는 16자 영숫자 문자열로 구성된 16줄을 생성합니다.

출력 예:

nZ3BED8FYGNkYMGc
zu83X7pgqLX36q2B
mocN9MhYoXzOwKkO
Ly2lfakdJXcX3J1s
I3Zezk8wkwkX7wKg
UZh36waccItxARGN
7qxJSnpKRcPR6Vki
fhTW3wd0ftygKxET
YQzKUxhBdEQ3O2rY
fy2tcApkl5KYOjYe
F05WqnwMRGIevzh9
q2c86PsKGlJkjijp
h6ig7eXzPhjY75h7
PX0ikEW2z8ptQsAI
M5mdMSvQmvmWF5yS
GCPqQklXHc8H2Kmv

이 문자열에서 지정된 길이(범위)의 숫자를 가져와야 합니다. 예를 들어 에서 숫자를 가져오려면 E4wla28wqm3681rX길이 범위는 4~16입니다. 결과는 다음과 같습니다 3681.

grep마지막을 다음과 같이 수정하려고 시도했지만 섹션이 grep -o '[0-9]{4,16}'없어도 전혀 아무것도 제공하지 않습니다 . 주어진 문자열의 각 숫자(숫자가 아님!)를 별도의 줄에 표시합니다. 예를 들어 다음과 같습니다 .head -n 16grep '[0-9]*'E4wla28wqm3681rX

4
28
3681

grep -o '[0-9]+'와 같은 것 grep -o '[0-9]{1}'또는 아무것도 제공되지 않습니다 grep -o '[0-9]{1, }'.

누구든지 이 문제를 해결하도록 도와주실 수 있나요? 아니면 적어도 위에서 언급한 "greps"에 어떤 문제가 있는지 말해 줄 수 있습니까?

문법 오류에 대해 사과드립니다.

답변1

익숙한 정규식이 제대로 작동하려면 "-E" 플래그를 사용하여 "확장 정규식"을 활성화해야 합니다. 이렇게 하면 정규 표현식이 작동합니다.

... | grep -E -o '[0-9]{4,16}' 

이 경우에는 일부 배포판에서 지원하는 플래그 -P(Perl 호환 정규식) 가 필요하지 않습니다.

답변2

해당 단일 행을 확장하고 약간 재정렬하고 몇 가지 조정을 하면 다음과 같은 결과를 얻을 수 있습니다.

cat /dev/urandom | \
    tr -dc 'a-zA-Z0-9' | \
    fold -w 16 | \
    tr -d '[A-z]' | \
    grep '....' | \
    head -n 16

산출:

7405935
60722
11225
96954
3966
8774
539418
1964
59150
5994
1086
7470
2751
8534
21501
14927

참고: 개별적으로 살펴보면 n자리 숫자는 무작위일 수 있지만 숫자 길이 분포는 다음과 같습니다.아니요. 다음은 모든 숫자가 "x"로 변경되고 정렬된 후 계산된 1,000,000개의 실행입니다.

 cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 16 | \
    tr -d '[A-z]' | grep '....' | head -n 1000000 | \
    tr '[0-9]' x | sort | uniq -c | nl -v 4

산출:

 4   594210 xxxx
 5   275196 xxxxx
 6    96871 xxxxxx
 7    26838 xxxxxxx
 8     5738 xxxxxxxx
 9      997 xxxxxxxxx
10      134 xxxxxxxxxx
11       14 xxxxxxxxxxx
12        2 xxxxxxxxxxxx

숫자가 높을수록 숫자가 나올 확률이 낮아진다는 것을 알 수 있습니다. 백만 개의 숫자 중 단 두 개만이 12자리이고, 13~16자리는 하나도 없습니다.

관련 정보