Mac OSX의 bash 스크립트에서 내 정규식이 sed와 작동하지 않는 이유는 무엇입니까?

Mac OSX의 bash 스크립트에서 내 정규식이 sed와 작동하지 않는 이유는 무엇입니까?

CBX-1234문자열 CBX-1234--CBX-5678또는 에서 문자열을 가져오려고 합니다 CBX-12345--CBX-5678. Mac OSX에서 bash 스크립트를 사용하고 sed를 사용하여 정규식을 실행하고 있습니다.

string="CBX-1234--CBX-5678"
shortenedString=$(echo "$string" | sed "s/^([A-Za-z]+-[0-9]+)/\1/")

그러면 다음과 같은 오류 메시지가 출력됩니다.

sed: 1: "s/^([A-Za-z]+-[0-9]+)/\1/": \1은 RE에 정의되지 않았습니다.

하위 문자열을 캡처하는 방법은 무엇입니까? bash에서 sed나 다른 수단을 사용하는 것에 대한 제안을 환영합니다.

답변1

확장 정규식을 사용하려면 명령줄 -E에 다음을 추가해야 합니다 .sed

sed -E 's/^([A-Za-z]+-[0-9]+)/\1/'

CBX-1234--CBX-5678문자열을 로 줄이려면 CBX-1234전체 문자열을 고려하여 대체 항목도 수정해야 합니다.

sed -E 's/^([A-Za-z]+-[0-9]+).*/\1/'

bash매개변수 확장을 사용할 수도 있습니다.

shortenedString="${string%%--*}"

$string이렇게 하면 처음 발생한 이후의 모든 항목이 삭제됩니다 --.

답변2

나는 항상 사용sed -r

$ echo "abhellocd" | sed -r "s/.*(hello).*/\1/g"
hello

sed 매뉴얼 페이지에서:

   -r, --regexp-extended
          use extended regular expressions in the script.

이 옵션 -E은 내가 나열한 것이 아닙니다. 그것도 작동하지만.

답변3

당신은 그것을 사용할 수 있습니다 echo "$string" | cut -d "-" -f 1,2.

관련 정보