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