GREP는 다른 데이터의 6~7자리 숫자와 일치합니다.

GREP는 다른 데이터의 6~7자리 숫자와 일치합니다.

6자리 또는 7자리 숫자 문자열과 일치하는 정규식을 만들려고 합니다.

[0-9]{6,7} 이것은 작동하지만 7자리보다 긴 문자열을 일치시키고 싶지 않습니다.

굵은 숫자를 일치시켜야 하는 경우 아래 샘플 데이터를 참조하세요. 일부 6-7자리 문자열의 시작과 끝 부분에 다양한 문자(줄 바꿈, 탭, 공백)가 있으며 문자열의 시작 부분에 2개 이상의 0이 일치하는 것을 원하지 않습니다.

1139055_00000000000000.jpg1139065_00000000000000.jpg

12345678 1045977_00000000000000.jpg

_1162679.jpg ID:1099695_20230615142941.jpg 1099692_20230615142939.jpg 1162700_00000000000000.jpg 012456.psd 제목:0582457_00_CC 0123456789 제목:6844393_50_v2 제목:6844393_50_v2.psd 0001456789 0000001546800000

합계: 14 6582457_00_C 5142090_00_c ID:1178287제목:6582457_00_CC 제목:6844393_50_v2 ID:1178288제목:_0042090_00_cc __6771292_00_cc

입력 예:

1139055_00000000000000.jpg 1139065_00000000000000.jpg
12345678 1045977_00000000000000.jpg
_1162679.jpg ID:1099695_20230615142941.jpg 1099692_20230615142939.jpg 1162700_00000000000000.jpg 012456.psd Title: 0582457_00_CC 0123456789 Title: 6844393_50_v2 Title: 6844393_50_v2.psd 0001456789 0000001546800000
Total: 14 6582457_00_C 5142090_00_c Id: 1178287 Title: 6582457_00_CC Title: 6844393_50_v2 Id: 1178288 Title: _0042090_00_cc __6771292_00_cc

예상 출력:

1139055
1139065
1045977
1162679
1099695
1099692
1162700
012456
0582457
6844393
6844393
6582457
5142090
1178287
6582457
6844393
1178288
6771292

도움을 주시면 감사하겠습니다.

답변1

요약하자면, 당신은 일치하고 싶습니다소수점 이하 자릿수 중 적어도 하나는 0이 아니어야 하고 그 뒤에 다른 자릿수가 와야 합니다.4개 아니면 5개앞이나 뒤에 다른 숫자가 없는 10진수인가요?

그렇다면 PCRE 모드에서 GNU grep을 사용하여 다음을 찾으십시오.

grep -P '(?<!\d)([1-9][0-9]|[0-9][1-9])[0-9]{4,5}(?!\d)'

다음 명령을 사용하여 입력을 테스트하십시오 -o.

$ grep -Po '(?<!\d)([1-9][0-9]|[0-9][1-9])[0-9]{4,5}(?!\d)' << \EOF
    1139055_00000000000000.jpg 1139065_00000000000000.jpg

    12345678 1045977_00000000000000.jpg

    _1162679.jpg ID:1099695_20230615142941.jpg 1099692_20230615142939.jpg 1162700_00000000000000.jpg 012456.psd Title: 0582457_00_CC 0123456789 Title: 6844393_50_v2 Title: 6844393_50_v2.psd 0001456789 0000001546800000

    Total: 14 6582457_00_C 5142090_00_c Id: 1178287 Title: 6582457_00_CC Title: 6844393_50_v2 Id: 1178288 Title: _0042090_00_cc __6771292_00_cc
EOF
1139055
1139065
1045977
1162679
1099695
1099692
1162700
012456
0582457
6844393
6844393
6582457
5142090
1178287
6582457
6844393
1178288
6771292

답변2

간단한 솔루션을 원하고 단일 정규 표현식이 필요하지 않다고 가정하면 GNU awk(대부분의 Unix 시스템에서 사용 가능하거나 설치 가능)를 사용하여 다중 문자를 처리하십시오 RS.

$ awk -v RS='[^0-9]+' '!/^00/ && /^.{6,7}$/' file
1139055
1139065
1045977
1162679
1099695
1099692
1162700
012456
0582457
6844393
6844393
6582457
5142090
1178287
6582457
6844393
1178288
6771292

또는 모든 Unix 시스템의 쉘에서 awk를 사용하여 다음을 수행할 수 있습니다.

awk -F'[^0-9]+' '{ for (i=1; i<=NF; i++) if ( ($i !~ /^00/) && (length($i) ~ /^[67]$/) ) print $i }' file

또한 정규식 간격 표기법을 위한 POSIX awk(MacOS의 BSD awk 포함)를 사용하면 {6,7}awk에 대한 이전 호출을 사용하여 숫자가 아닌 모든 문자열을 개행 문자로 변환하여 기본값이 RS다음을 따르도록 할 수 있습니다.

awk '{gsub(/[^0-9]+/,RS)} 1' file | awk '!/^00/ && /^.{6,7}$/'

또는 다시 awk를 사용합니다.

awk '{gsub(/[^0-9]+/,RS)} 1' file | awk '!/^00/ && (length() ~ /^[67]$/)'

원하고 사용 중인 버전에서 작동하는 경우 tr -cs '0-9' '\n' < file대신 또는 유사한 버전을 사용할 수 있습니다.awk '{gsub(/[^0-9]+/,RS)} 1' filetr

답변3

grep, sed 및 awk 체인은 필요한 목록을 제공합니다.

$ egrep '[0-9]*' -o Q768182 | sed '/00/d' | awk 'length>5 && length <8'
1139055
1139065
1045977
1162679
1099695
1099692
012456
0582457
6844393
6844393
6582457
5142090
1178287
6582457
6844393
1178288
6771292

답변4

이 정규식은 귀하의 예에 맞는 작업을 수행하는 것 같습니다.

(?:[^0-9]|^)((?:0[1-9]|[1-9]0|[1-9]{2})[0-9]{4,5})(?:[^0-9]|$)
  • (?:[^0-9]|^): 줄의 시작이나 앞의 문자가 숫자가 아닌지 확인하세요.
  • ((?:0[1-9]|[1-9]0|[1-9]{2})[0-9]{4,5}): 앞자리에 00을 제외한 6~7자리 숫자를 얻습니다.
  • (?:[^0-9]|$): 줄 끝이나 그 뒤의 문자가 숫자가 아닌지 확인하세요.

넌 그걸 가지고 놀 수 있어https://regex101.com/r/scZc9q/1

첫 번째/마지막 문자가 일치하는 문자열에 있으므로 이를 사용하는 가장 쉬운 방법은 다음을 grep사용하여 이러한 문자를 제거하는 것입니다 sed.

grep -oE '([^0-9]|^)(0[1-9]|[1-9]0|[1-9]{2})[0-9]{4,5}([^0-9]|$)' tmp | sed 's/[^0-9]//g'

관련 정보