Bash를 사용한 게으른 정규식

Bash를 사용한 게으른 정규식

Bash에 내장된 정규 표현식 기능을 사용하여 HTML 태그에 포함된 텍스트만 일치시키려고 합니다.

string='<span class="circle"> </span>foo</span></span>'
regex='<span class="circle"> </span>(.+?)</span>'
[[ $string =~ $regex ]]
echo "${BASH_REMATCH[1]}"

하지만 게임은 계속됩니다 foo</span>.

인터넷에는 sed 및 grep 예제가 너무 많아서 Bash 자체 정규식에 대한 문서를 많이 찾지 못했습니다.

답변1

인터넷에 대안이 넘쳐나는 이유가 있습니다. 나는 당신이 어떤 일을 겪고 있는지 정말 상상할 수 없습니다.강요된이를 위해 bash를 사용하십시오. 해당 작업을 위해 설계된 도구 중 하나를 사용하는 것은 어떻습니까?

=~어쨌든, 내가 아는 한, 비 욕심적 일치를 수행하기 위해 연산자를 사용할 수 있는 방법은 없습니다 . 이는 bash의 내부 정규식 엔진을 사용하지 않고 다음과 man 3 regex같이 시스템의 C 엔진을 사용하기 때문입니다 man bash.

   An additional binary operator, =~, is available, with the  same  prece‐
   dence  as  ==  and !=.  When it is used, the string to the right of the
   operator is considered  an  extended  regular  expression  and  matched
   accordingly  (as  in  regex(3)).  

그러나 원하는 대로 어느 정도 할 수 있습니다(실제로 이는아니요HTML 파일을 구문 분석하는 좋은 방법) 정규식은 약간 다릅니다.

string='<span class="circle"> </span>foo</span></span>'
regex='<span class="circle"> </span>([^<]+)</span>'
[[ $string =~ $regex ]]; 
echo "${BASH_REMATCH[1]}"

위의 내용은 foo예상대로 반환됩니다.

답변2

bash의 정규 표현식이 Perl의 정규 표현식만큼 탐욕스럽지 않은지 잘 모르겠습니다. 따라서 Perl 정규 표현식 엔진을 사용하십시오.

$ grep -oP '<span class="circle"> </span>\K.+?(?=</span>)' <<<"$string"
foo

관련 정보