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]
일치합니다 . 는a
b
c
[^ ]
부정적인문자 클래스는 그 안에 있는 문자를 제외한 모든 항목과 일치합니다. 따라서 [^/]*
가장 긴 비문자열이 일치됩니다 /
. ^
정규식 시작 부분의 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