![Mac OSX의 bash 스크립트에서 내 정규식이 sed와 작동하지 않는 이유는 무엇입니까?](https://linux55.com/image/105700/Mac%20OSX%EC%9D%98%20bash%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%97%90%EC%84%9C%20%EB%82%B4%20%EC%A0%95%EA%B7%9C%EC%8B%9D%EC%9D%B4%20sed%EC%99%80%20%EC%9E%91%EB%8F%99%ED%95%98%EC%A7%80%20%EC%95%8A%EB%8A%94%20%EC%9D%B4%EC%9C%A0%EB%8A%94%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
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
.