나는 정규 표현식 장을 읽고 있습니다.클래식 쉘 스크립트샘플 코드를 입력하세요.
명령은 다음과 같습니다. "/home/tolstoy" 경로를 "/home/lt"로 변경합니다.
$ echo /home/tolstoy | sed 's;\(/home\)/tolstoy/;\1/lt/;'
/home/lt
그러나 내 노트북의 zsh에서 실행하면 반환 결과는 다음과 같습니다.
/home/tolstoy
이 명령이 잘못된 걸까요? 올바른 명령은 무엇입니까? 왜?
답변1
/
정규 표현식에서 string 이후를 일치시키려고 합니다 tolstoy
. 입력에 값이 존재하지 않으므로 /
표현식이 일치하지 않습니다.
/
입력에 포함되도록 수정합니다.
$ echo /home/tolstoy/ | sed 's;\(/home\)/tolstoy/;\1/lt/;'
/home/lt/
후행과 일치하지 않도록 수정되었습니다 /
.
$ echo /home/tolstoy | sed 's;\(/home\)/tolstoy;\1/lt/;'
/home/lt/
( 후행 입력 tolstoy
에 관계없이 ) 올바르게 찾은 상위 디렉토리를 수정 하고 해당 경로 끝에 추가하십시오./
lt
$ printf '%s/lt\n' "$(dirname /home/tolstoy)"
/home/lt
또는,
$ printf '%s\n' "$(dirname /home/tolstoy)/lt"
/home/lt
일반적으로 Unix 경로 이름에는 줄 중심 텍스트 편집 도구를 사용하지 마십시오. 그렇게 하면 작성 중인 스크립트나 명령이 개행 문자가 포함된 특정 경로 이름(흔하지는 않지만 유효함)에서 제대로 작동하지 못하게 됩니다.