다음 정규 표현식과 함께 sed를 사용하세요.
message=$(echo "$path" | sed -E 's/(.+pattern[0-9][0-9]*).+/\1/')
다음과 같은 줄에 이 표현식을 사용하세요.
/lol/pattern03657/qsd/qsd/pattern0001/qsd/
다음으로 대체됩니다:
/lol/pattern03657/qsd/qsd/pattern0001
그리고 나는 그들이 다음과 같기를 바랍니다:
/lol/pattern03657/
나는 sed가 첫 번째 발생을 대체할 것이라고 생각했지만 그렇게 하지 않는 것 같습니다. 내 코드가 이런 식으로 동작하게 하려면 무엇을 변경해야 합니까?
답변1
그 이유는 *
가 +
탐욕적 수량자이며 가능한 한 많이 일치시키려고 하기 때문입니다.
$ echo '/lol/pattern03657/qsd/qsd/pattern0001/qsd/' | sed -E 's/(.+pattern[0-9][0-9]*).+/\1/'
/lol/pattern03657/qsd/qsd/pattern0001
perl
?
탐욕스럽지 않은 수량자에 추가하여+
$ echo '/lol/pattern03657/qsd/qsd/pattern0001/qsd/' | perl -pe 's/(.+?pattern\d+\/).+/\1/'
/lol/pattern03657/
grep
또는 pcre
가능한 경우 옵션 포함
$ echo '/lol/pattern03657/qsd/qsd/pattern0001/qsd/' | grep -oP '^.+?pattern\d+/'
/lol/pattern03657/
한 가지 해결책 sed
은 문자열이 나타나는 위치를 아는 것입니다. 예를 들어:
$ echo '/lol/pattern03657/qsd/qsd/pattern0001/qsd/' | sed -E 's|^(/[^/]+/pattern[0-9][0-9]*/).+|\1|'
/lol/pattern03657/
여기서는 줄의 처음부터 그룹이 /text/
문자열 앞에 옵니다.