sed +는 경로에서 첫 번째 디렉터리를 제거합니다.

sed +는 경로에서 첫 번째 디렉터리를 제거합니다.

sed, 를 통해 경로에서 첫 번째 디렉터리를 제거해야 합니다(pf가 수행하는 작업과 반대) basename.

예를 들어

echo "/mnt/VPfig/Amer/AR4/Celtel/files/COM.txt" | sed ...

나는 다음을 얻어야 한다:

/VPfig/Amer/AR4/Celtel/files/COM.txt

답변1

노력하다:

echo "/mnt/VPfig/Amer/AR4/Celtel/files/COM.txt" | sed 's|^/[^/]*||'

이것은 나에게 다음을 제공합니다:

/VPfig/Amer/AR4/Celtel/files/COM.txt

첫 번째 항목을 찾은 /다음 /가능한 한 많은 non--을 찾아서 빈 문자열로 바꿉니다.

답변2

POSIX 셸에서:

$ x='/mnt/VPfig/Amer/AR4/Celtel/files/COM.txt'
$ printf "/%s\n" "${x#/*/}"
/VPfig/Amer/AR4/Celtel/files/COM.txt

설명하다

이것매개변수 확장 ${x#/*/}경로의 선행 구성 요소를 삭제하고 /두 개의 로 둘러싸서 printf선행을 다시 고정합니다 /.

답변3

가장 간단한 방법은 /문자열의 시작 부분에서 가장 짧은 비문자열을 제거하는 것입니다.

대부분의 정규식 언어에서 [ ]os는 대괄호 안의 모든 항목과 일치하는 문자 클래스입니다. 또는 또는 와 [abc]일치합니다 . 는abc[^ ]부정적인문자 클래스는 그 안에 있는 문자를 제외한 모든 항목과 일치합니다. 따라서 [^/]*가장 긴 비문자열이 일치됩니다 /. ^정규식 시작 부분의 A는 입력 문자열의 시작 부분에서만 일치하도록 합니다. 이를 결합하면 다음과 같은 작업을 수행할 수 있습니다.

$ echo "/mnt/VPfig/Amer/AR4/Celtel/files/COM.txt" | sed 's/^\/[^/]*//'
/VPfig/Amer/AR4/Celtel/files/COM.txt

또는 awk의 입력 필드 구분 기호를 설정 /하고 마지막 필드를 제외한 모든 필드를 인쇄할 수 있습니다.

$ echo "/mnt/VPfig/Amer/AR4/Celtel/files/COM.txt" | 
    awk -F/ '{for(i=3;i<=NF;i++){printf "/%s",$i};print ""}'

또는 몇 가지 Perl 트릭을 사용할 수 있습니다.

$ echo "/mnt/VPfig/Amer/AR4/Celtel/files/COM.txt" | 
    perl -F/ -lane 'print "/",join "/",@F[2..$#F]'
/VPfig/Amer/AR4/Celtel/files/COM.txt

또는 더 나은 Perl 트릭@Joseph R.이 제안한대로.:

$ echo "/mnt/VPfig/Amer/AR4/Celtel/files/COM.txt" | perl -pe 
   perl -pe 's{^/.*?(?=/)}{}'

또는 간단히 말하면:

$ echo "/mnt/VPfig/Amer/AR4/Celtel/files/COM.txt" | perl -pe 's#/[^/]+/#/#'
/VPfig/Amer/AR4/Celtel/files/COM.txt

마지막으로 Perl 정규식의 강력한 기능을 사용할 수도 있습니다 grep.

$ echo "/mnt/VPfig/Amer/AR4/Celtel/files/COM.txt" | grep -oP '/[^/]+?\K/.*'
/VPfig/Amer/AR4/Celtel/files/COM.txt

관련 정보