$ 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/_/;/'