문자열이 주어지면 정확히 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
언제든지 egrep
Linux/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