사용자로부터 특정 절대 파일 경로를 수신 하고 파일 경로 의 첫 번째 두 구성 요소 만 포함 하지 않고 인쇄하거나 아무것도하지 않는 문자열이되는 변수를 만들고 싶습니다 .
예를 들어, 절대 경로는 다음과 같습니다.
/home/myusername/folder1/folder2/folder3
그리고 “target_path”에 저장되었으며 “mydir”만 :
/folder1/folder2/folder3
다른 방법으로 cut 명령을 사용했지만 성공하지 못했습니다.
답변
사용 배쉬의 문자열 조작을 :
$ a=/home/myusername/folder1/folder2/folder3
$ echo "${a#/*/*/}"
folder1/folder2/folder3
따라서 원하는 문자열은 다음과 같습니다 (슬래시를 다시 추가).
b="/${a#/*/*/}"
변수의 경우 a
, ${a#foo}
가장 짧은 문자열 일치를 제거 foo
으로부터 시작 의 a
. 따라서 /
경로에 선행 슬래시를 포함하여 3을 포함하는 가장 짧은 문자열 을 제거하여 절대 경로의 처음 두 구성 요소를 제거합니다.
답변
다음은 사용 예입니다 cut
echo "/home/myusername/folder1/folder2/folder3" | cut -d '/' -f4-
folder1/folder2/folder3
행간이 필요한 경우 줄 끝에 /
추가 할 수 | sed 's/^/\//'
있습니다.
필드 사이의 구분자 로 사용하도록 지시 하기 -f4-
때문에 필요 합니다. 따라서 첫 번째 필드는 첫 번째 구분 기호 앞에옵니다.이 경우 첫 번째 필드는 비어 있습니다. 4 번째 필드도 마찬가지 이며 4 번째부터 모든 필드를 사용하도록 cut에 지시합니다.-d '/'
cut
/
folder1
-f4-
답변
bash 매개 변수 확장을 다음과 같이 사용할 수 있습니다.
target_path=/home/username/folder1/folder2/folder3
myvar="/${target_path#/*/*/}"
금후:
echo $myvar
제공합니다 :
/folder1/folder2/folder3
쉘 매개 변수 확장 구문 /*/*/
을 사용하여 target_path 변수에서 패턴의 첫 번째 일치를 제거하여 작동 ${target_path#pattern}
합니다. 불행히도 이것은 첫 번째 /
문자를 제거 하므로 myvar 변수를 설정하는 동안 해당 문자를 명시 적으로 포함해야합니다.
경고 : 이 방법을 사용하기 전에 target_path 변수에 일부 문자가 포함되어 있고 두 개의 경로 세그먼트보다 긴지 확인해야합니다. 예를 들어 만약 target_path=/home/username/
다음, myvar=/
. 와 같은 것을 실행하면 시스템에 위험 할 수 있습니다 rm -rf "$myvar"*
. 이것을 시도하지 마십시오!