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의 내부 정규식 엔진을 사용하지 않고 에 정의된 시스템의 C 엔진을 사용하기 때문입니다 man 3 regex. 이에 대한 설명은 다음과 같습니다 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

관련 정보