문자열의 정확한 자릿수를 일치시킵니다.

문자열의 정확한 자릿수를 일치시킵니다.

문자열이 주어지면 정확히 7개의 연속 숫자가 포함되어 있는지 확인하는 방법은 무엇입니까?

예를 들어 1505082또는 1505082_CSE_322그렇지 않음 15050821또는15050821_CSE_322

나는 노력했다

grep -Eq [0-9]{7} <<< "1505082" 

돌아 0오지만

grep -Eq [0-9]{7} <<< "15050821"` 

또한 반환되었습니다 0.

내가 뭘 잘못했나요?

답변1

예, 다음과 같습니다(정규식을 인용하지 않으면 쉘 글로브로 해석됩니다).

grep -Eq '[0-9]{7}' <<< "1505082"

grep은 7자리 숫자와 일치합니다. q를 다음으로 바꾸면 일치하는 항목을 확인할 수 있습니다 o.

$ grep -Eo '[0-9]{7}' <<< "1505082"; echo "$?"
1505082
0

예, 이것도 일치합니다:

$ grep -Eq '[0-9]{7}' <<< "150508299999"; echo "$?"
1505082
0

9를 모두 제거합니다.
문제는 고정되지 않은 일치를 수행하고 있다는 것입니다. 이는 7자리 숫자(이상) 숫자.

당신은 할 수그리고:

$ grep -Eq '^[0-9]{7}$' <<< "15050829999"; echo "$?"
1

7자리 숫자 일치어딘가에숫자가 아닌 숫자가 뒤나 앞에 오면 완전히 다른 앵커가 필요합니다.

$ grep -oP '(?<=^|[^0-9])[0-9]{7}(?=[^0-9]|$)' <<< "1505082"; echo $?
1505082
0

$ grep -oP '(?<=^|[^0-9])[0-9]{7}(?=[^0-9]|$)' <<< "1505082_CSE_322"; echo $?
1505082
0

$ grep -oP '(?<=^|[^0-9])[0-9]{7}(?=[^0-9]|$)' <<< "1505082999_CSE_322"; echo $?
0

이는 미리보기 일치이고 하나는 되돌아보기입니다.

(?<=^|[^0-9])

^문자열( )의 시작 또는 숫자가 아닌 항목 과 일치합니다 . 다른 하나는 미리보기입니다.

(?=[^0-9]|$)

숫자나 문자열 끝 이외의 항목과 일치합니다.


더 간단한 정규식을 사용하는 유일한 다른 대안은 Extended임의의 (또는 그 이상) 숫자를 추출한 7다음 그것이 정확히 7자리인지 확인하는 것입니다.

$ echo "150508299_CSE_322" | 
          grep -oE '[0-9]{7,}' | 
                  grep -qE '^[0-9]{7}$'; echo "$?"
1

답변2

상황이 복잡해지면 grep언제든지 egrepLinux/Unix 시스템에서 사용할 수 있는 프로그래밍 언어를 사용하여 일치/정규 표현식에 도움을 받을 수 있습니다.

시스템에 Perl이나 Ruby가 있는 경우 한 줄로 수행할 수 있습니다.

echo 1234567| ruby -lne 'print if /^\d{7}$/'

echo 1234567| perl -lne 'print if /^\d{7}$/'

또는

cat file.txt | ruby -lne 'print if /^\d{7}$/'

답변3

Bash의 이진 연산자를 사용하지 않는 이유는 무엇입니까 =~?

$ [[ 1505082 =~ [0-9]{7} ]] && echo matched
matched

자세한 내용은 다음을 참조하세요.http://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#Conditional-Constructs

관련 정보