사용https://regex101.com/문자열에서 IP 주소가 처음 나타나는 것을 반환하는 정규식을 작성했습니다.
정규식:
(?:\d{1,3}\.)+(?:\d{1,3})
구분 기호를 포함하는 정규식:
/(?:\d{1,3}\.)+(?:\d{1,3})/
다음 테스트 문자열을 사용하십시오.
eu-west 140.243.64.99
다음과 완전히 일치하는 항목을 반환합니다.
140.243.64.99
다음 bash 스크립트는 앵커 등을 사용해도 생성된 정규식에서 작동하지 않습니다.
temp="eu-west 140.243.64.99 "
regexp="(?:\d{1,3}\.)+(?:\d{1,3})"
if [[ $temp =~ $regexp ]]; then
echo "found a match"
else
echo "No IP address returned"
fi
답변1
\d
"모든 숫자"를 말하는 비표준 방법입니다. Perl에서 나온 것 같은데, 다른 많은 언어와 유틸리티도 Perl 호환 RE(PCRE)를 지원합니다. (예를 들어 Debian Stretch의 GNU grep 2.27은 \w
일반 모드에서도 유사한 단어 문자를 지원합니다.)
하지만 Bash는 이를 지원하지 않으므로 \d
명시적으로 [0-9]
or 를 사용해야 합니다 [[:digit:]]
. 캡처하지 않는 그룹의 경우에도 마찬가지입니다 . (?:..)
직접 사용하세요 (..)
.
다음과 같이 인쇄되어야 합니다 match
.
temp="eu-west 140.243.64.99 "
regexp="([0-9]{1,3}\.)+([0-9]{1,3})"
[[ $temp =~ $regexp ]] && echo match
답변2
(:...)
\d
Perl 또는 PCRE 정규식 연산자입니다( GNU 에서와 같이 ) grep -P
.
bash
의 확장 정규식만 지원되지만 따옴표가 없는 확장(예: in 또는 ) 의 결과가 아닌 grep -E
in 과 같이 문자 그대로 전달된 정규식의 경우 POSIX 확장 정규식 기능 세트로 제한됩니다.[[ text =~ regexp-here ]]
[[ text =~ $var ]]
[[ test =~ $(printf '%s\n' 'regexp-here') ]]
따라서 작동하는 시스템에서도 grep -E '\d'
(GNU ERE는 이미 Perl 정규식에서 일부 확장을 가져오고 \s
향후 버전에서는 사용할 수 있음 \d
) 다음을 사용해야 합니다.
regexp='\d'
[[ $text =~ $regexp ]]
작동하게 만드세요 bash
( [[ $text =~ \d ]]
안 됩니다).
PCRE를 지원하는 쉘의 경우 다음을 사용해야 할 수도 있습니다 zsh
.
set -o rematchpcre
[[ $text =~ '(?:\d{1,3}\.)+(?:\d{1,3})' ]]
ksh93은 또한 패턴 일치의 일부로 Perl과 유사한 정규식(완전히 호환되지 않음)의 자체 구현을 지원합니다. 거기에서 다음을 사용할 수 있습니다.
regexp='~(P)(?:\d{1,3}\.)+(?:\d{1,3})'
[[ $text = $regexp ]]
( =
대신 주의하세요 =~
. 임시 변수를 사용하지 않으면 많은 문제가 발생하므로 임시 변수를 사용해야 합니다.)
답변3
웹사이트정규식101.comPCRE(왼쪽 상단 참조)를 기본값으로 사용하며 "확장" 정규식 구문에 대한 지원이 부족합니다. 이것은 "Perl 호환 정규식"이며 Perl에서 유래되었습니다(합리적으로 예상되는 대로).
경우에 따라 PCRE는 일부 도구(예: )에서 지원되지만 grep -P
관용구의 bash 정규식 지원은 [[…]]
확장 정규식(예: grep -E
)에만 적용됩니다.
확장 정규식에는 비캡처 (?…)
괄호가 없고 \d도 없습니다. 간단 (…)
하고 다음을 사용해야 합니다 [0-9]
.
regexp="([0-9]{1,3}\.)+([0-9]{1,3})"