![Bash를 사용한 게으른 정규식](https://linux55.com/image/36237/Bash%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%9C%20%EA%B2%8C%EC%9C%BC%EB%A5%B8%20%EC%A0%95%EA%B7%9C%EC%8B%9D.png)
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