배쉬 = ~ 정규식 및 https://regex101.com/


12

https://regex101.com/을 사용 하여 문자열에서 IP 주소의 첫 항목을 반환하는 정규식을 작성했습니다.

정규식 :

(?:\d{1,3}\.)+(?:\d{1,3})

구분자를 포함한 RegExp :

/(?:\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

3
그것은 나에게 Perl 정규식처럼 보입니다. Bash는이를 지원하지 않습니다.
Kusalananda

1
=~연산자는 설명 매뉴얼에 여기 가 bash에 사용하는 "확장 된 정규 표현식"을 작성 어디. 확장 된 정규 표현식은 regex(7)매뉴얼 페이지에 설명되어 있으며 여기에 간략하게 요약되어 있습니다 .
glenn jackman

답변:


15

\d"모든 숫자"를 말하는 비표준 방법입니다. 나는 그것이 Perl에서 온 것이라고 생각하며, 다른 많은 언어와 유틸리티도 Perl 호환 RE (PCRE)를 지원합니다. (예를 들어 데비안 스트레치의 GNU grep 2.27 \w은 일반 모드에서도 비슷한 단어 문자를 지원 합니다.)

Bash는을 지원하지 않으므로 \d명시 적으로 [0-9]또는을 사용해야 [[:digit:]]합니다. 캡처하지 않는 그룹 (?:..)과 동일하지만 (..)대신 사용하십시오.

이것은 인쇄해야합니다 match:

temp="eu-west                       140.243.64.99            "
regexp="([0-9]{1,3}\.)+([0-9]{1,3})"
[[ $temp =~ $regexp ]] && echo match

2
GNU가 없이도 grep지원 합니까 ? \d-P
Stéphane Chazelas

@ StéphaneChazelas는 물론 아닙니다. 그것은 지원을 수행 \w하고 \b난 혼란 것을 가지고 내가, 펄에서 배운한다.
ilkkachu

1
\dPCRE가 "비표준" 이라고 말하는 것은 실제로 공평하지 않습니다 . 그것들은 아주 표준이며, 원래 정규 표현식과 확장 정규 표현식과는 다른 표준입니다.
Daniel Farrell

1
이 경우의 표준 인 @DanielFarrell은 POSIX가 지정하는\d입니다. PCRE는 다소 표준 적이거나 가장 잘 정의되어 있지 않습니다. 성가신 문제는 GNU의 그렙 (또는 glibc는이) 일부는 PCRE와 같은 원자, 적어도 지원한다는 것입니다 \w\sERE을 해석 할 때, 그 상황에서 그들은 매우 많이 있습니다 비표준. 내 구절은 그 부분에서 비롯된 부분 일 수 있으며, \dGNU 지원과 마찬가지로 잘못 기억 될 수도 있습니다 .
ilkkachu

4

(:...)\d(GNU처럼 펄이나 PCRE 정규 표현식 연산자입니다 grep -P).

bash인용 부호없는 확장의 결과 ( 또는 grep -E에서 [[ text =~ regexp-here ]]와 같이)가 아닌 그대로 문자 그대로 전달 된 정규 표현식의 경우 POSIX 확장 정규 표현식 기능 세트로 제한 된다는 점을 제외하고 확장 정규 표현식 만 지원합니다 .[[ text =~ $var ]][[ test =~ $(printf '%s\n' 'regexp-here') ]]

따라서 grep -E '\d'작동 할 시스템 (GNU ERE가 이미 \s이후 버전 과 마찬가지로 perl 정규식에서 일부 확장을 가져 왔습니다 \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 ]]

( =대신에 참고하십시오 =~. 임시 변수는 사용하지 않을 때 매우 버그가 많으므로 임시 변수를 사용하는 것이 좋습니다)


1

사이트 regex101.com 은 PCRE (왼쪽 위 구석)를 기본값으로 사용하며 "확장"정규식 구문에 대한 지원이 없습니다. 그것은 "Perl Compatible Regular Expresions"인데, 이는 Perl에서 기대하는대로 합리적입니다.

PCRE는 grep -P일부 조건에서 (와 같은 ) 일부 도구에서 지원 되지만 [[…]]관용구 내에서 bash 정규식 지원 은 확장 정규식 (예 :)에만 해당됩니다 grep -E.

확장 정규식에는 비 캡처 (?…)괄호가 없으며 \ d도 없습니다. 당신은 간단 (…)하고 사용해야합니다 [0-9]:

regexp="([0-9]{1,3}\.)+([0-9]{1,3})"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.