이 sed 표현에 어떤 문제가 있나요?

이 sed 표현에 어떤 문제가 있나요?
$ echo "104_Fri" | sed 's/^\([0-9]+\)_\([A-Za-z]+\)$/\1;\2/'
104_Fri

시작 번호와 끝 문자를 각각 그룹으로 일치시키고 싶습니다. 그런 다음 첫 번째 그룹, 세미콜론, 두 번째 그룹을 출력하고 싶습니다.

나는 이 표현식이 다음을 생성하길 원합니다:

104;Fri

왜 이것이 작동하지 않습니까?

답변1

백슬래시 +:

$ echo "104_Fri" | sed 's/^\([0-9]\+\)_\([A-Za-z]\+\)$/\1;\2/'
104;Fri

알아채다+표준 기본 정규식 메타 문자가 아닙니다.따라서 백슬래시를 사용해도 이식 가능한 동작이 없습니다 sed.

사용하거나 sed -r활성화 sed -E해야 합니다.확장 정규식대신 이러한 문자를 백슬래시할 필요가 없습니다. 이러한 옵션도 비표준이지만 지원되지 않으면 알 수 없는 결함이 아닌 최소한 오류가 발생합니다. 이 옵션은 다음을 지원합니다.암소 비슷한 일종의 영양sed그리고 모든 주요 BSD 파생물(FreeBSD,오픈BSD,네트워크BSD,운영 체제), 그러나 많은 상업용 Unix 버전에서는 그렇지 않습니다.

이식성이 뛰어난 확장 정규식이 필요한 경우 다음을 사용하세요.awk, 항상 사용하세요.

답변2

더하기 기호도 이스케이프해야 합니다 +.

$ echo "104_Fri" | sed 's/^\([0-9]\+\)_\([A-Za-z]\+\)$/\1;\2/'
104;Fri

답변3

정규식 확장을 위한 옵션이 추가되었습니다. ;-) -r활성 콘텐츠의 필요성이 줄어듭니다.\

$echo "104_Fri" | sed -re 's/^([0-9]+)_([A-Za-z]+)$/\1;\2/'
104; 금요일

Q를 작성할 때 분할 작업(배경 데이터 없이)은 몇 가지 다른 간단한 방법으로 수행할 수 있습니다.

$echo "104_Fri" | tr '_' ';'
104; 금요일

$echo "104_Fri" sed 's/_/;/'
104; 금요일

...두 가지 예만 들겠습니다.

답변4

Perl은 대부분의 Unix 시스템에 사전 설치되어 있으므로 사용을 권장합니다.

$ echo '104_Fri' | perl -p -e 's/^([0-9]+)_([A-Za-z]+)$/$1;$2/'

다음과 같이 더욱 단순화할 수 있습니다.

$ echo '104_Fri' | perl -p -e 's/^(\d+)_([a-z]+)$/$1;$2/i'

노트:귀하의 입력이 실제로 질문만큼 간단하다면 다음을 수행하십시오 tr.

$ echo '104_Fri' | tr '_' ';'

또는 Perl을 사용하십시오.

$ echo '104_Fri' | perl -p -e 's/_/;/'

관련 정보