![이 간단한 경우에 왜 sed가 탐욕스럽지 않습니까?](https://linux55.com/image/2315/%EC%9D%B4%20%EA%B0%84%EB%8B%A8%ED%95%9C%20%EA%B2%BD%EC%9A%B0%EC%97%90%20%EC%99%9C%20sed%EA%B0%80%20%ED%83%90%EC%9A%95%EC%8A%A4%EB%9F%BD%EC%A7%80%20%EC%95%8A%EC%8A%B5%EB%8B%88%EA%B9%8C%3F.png)
$echo "foo 65 bar" | sed -n -e 's/.*\([0-9]\+\).*/\1/p'
5
왜 출력이 없나요 65
? sed가 그 부분을 탐욕스럽게 일치시키면 안 되나요 [0-9]\+
? sed에게 모든 항목을 일치시키려면 어떻게 해야 합니까 65
?
답변1
첫 번째는 .*
탐욕적입니다. 일치합니다 foo 6
. 여기서 멈추는 유일한 이유는 추가 일치로 인해 전체 패턴의 일치가 방지되므로 5
그대로 남아 있기 때문입니다 ([0-9]+)
. 성공하면 전체 라인과 ([0-9]*)
일치하며 .*
그룹에 아무것도 얻지 못합니다. 이 문제를 해결하는 한 가지 방법은 첫 번째 부분에 숫자가 일치하지 않도록 지시하는 것입니다.
$ echo "foo 65 bar" | sed -n -e 's/[^0-9]*\([0-9]\+\).*/\1/p'
65