OSX와 Ubuntu 모두에서 sed 명령이 작동하도록 하려면 어떻게 해야 합니까?

OSX와 Ubuntu 모두에서 sed 명령이 작동하도록 하려면 어떻게 해야 합니까?

나는 PS1 프롬프트를 사용자 정의하고 현재 디렉토리를 포함하는 것을 좋아합니다.

시간, 사용자, git 브랜치 등과 같은 다른 프로젝트가 여러 개 있습니다.

여기에 이미지 설명을 입력하세요.

그러나 한 가지 문제는 현재 디렉터리가 /home/durrantmm/Dropnot/webs/rails_apps/linker/app/views너무 많은 수준의 "깊은" 경우입니다. (그런데 어쨌든 PS1 프롬프트 설정이 끝날 때 Enter 키를 쳤기 때문에 실제 $가 왼쪽으로 돌아갔는데 여기서는 문제가 되지 않습니다.)

그래서 해결책이 있습니다. 위치 부분에 이것을 사용하십시오.

LOCATION='\033[01;34m\]`pwd | sed "s#\(/[^/]\+/[^/]\+/[^/]\+/\).*\(/[^/]\+/[^/]\+\)/\?#\1_\2#g"`'

예쁘지는 않지만 작업을 수행한 다음 다른 것(표시되지 않음, 여기에는 필요하지 않음)과 결합하여 디렉토리의 "처음 3개 레벨 _ 마지막 2개 레벨"을 얻습니다.

여기에 이미지 설명을 입력하세요.

불행히도 내 Mac에서는 sed 부분이 작동하지 않지만 다음을 얻습니다.

여기에 이미지 설명을 입력하세요.
[이것은 실제로 내 Linux 컴퓨터에서 가져온 것입니다. 궁금한 경우를 대비해 내 Mac에서 어떻게 보이는지 보여주기 위해 가짜로 만들었습니다.

3_2Mac에서 현재 디렉토리의 형식을 얻는 방법은 무엇입니까 ?

답변1

명령의 및 부분은 \+GNU 확장입니다. POSIX 호환성은 단순히 확장 정규식의 이러한 측면을 사용할 수 없습니다. 대신 및 를 사용할 수 있습니다. 이 시도:\?sedsed\{1,\}\{0,1\}

LOCATION='\033[01;34m\]`pwd |
  sed "s#\(/[^/]\{1,\}/[^/]\{1,\}/[^/]\{1,\}/\).*\(/[^/]\{1,\}/[^/]\{1,\}\)/\{0,1\}#\1_\2#g"`'

이에 대한 자세한 내용은 다음을 참조하세요 -http://pubs.opengroup.org/onlinepubs/009696699/utilities/sed.html그리고http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap09.html.

sed또는 .OSX 를 사용하여 OSX에서 확장 정규식을 활성화할 수 있습니다 -E. 이를 통해 다음을 수행할 수 있습니다.

LOCATION='\033[01;34m\]`pwd |
  sed -E "s#\(/[^/]+/[^/]+/[^/]+/\).*\(/[^/]+/[^/]+\)/?#\1_\2#g"`'

그러나 이는 GNU sed( -r사용되는)에서는 작동하지 않습니다. POSIX 솔루션을 사용하면 더 나은 이식성이 제공됩니다.

관련 정보