$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