sed를 사용하여 첫 번째 패턴만 교체

sed를 사용하여 첫 번째 패턴만 교체

다음 정규 표현식과 함께 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/문자열 앞에 옵니다.

관련 정보