bash의 변수에 문자열의 일부만 할당


11

사용자로부터 특정 절대 파일 경로를 수신 하고 파일 경로 의 첫 번째 두 구성 요소 만 포함 하지 않고 인쇄하거나 아무것도하지 않는 문자열이되는 변수를 만들고 싶습니다 .

예를 들어, 절대 경로는 다음과 같습니다.

/home/myusername/folder1/folder2/folder3

그리고 "target_path"에 저장되었으며 "mydir"만 :

/folder1/folder2/folder3

다른 방법으로 cut 명령을 사용했지만 성공하지 못했습니다.


/home/username실제 $HOME호출 한 사용자의 디렉토리는? 그렇다면 당신은 단순히 다음 mydir="${target_path#$HOME}"생각을 사용하여 그것을 제거 할 수 있습니다
steeldriver

답변:


15

사용 배쉬의 문자열 조작을 :

$ a=/home/myusername/folder1/folder2/folder3
$ echo "${a#/*/*/}"
folder1/folder2/folder3

따라서 원하는 문자열은 다음과 같습니다 (슬래시를 다시 추가).

b="/${a#/*/*/}"

변수의 경우 a, ${a#foo}가장 짧은 문자열 일치를 제거 foo으로부터 시작a. 따라서 /경로에 선행 슬래시를 포함하여 3을 포함하는 가장 짧은 문자열 을 제거하여 절대 경로의 처음 두 구성 요소를 제거합니다.


경로는 30 개의 폴더 일 수 있으며 마지막 28 개만 포함하고 싶습니다. 그래도 작동합니까?
pi의 생활

@Lifeofpi 왜 안돼?
muru

9

다음은 사용 예입니다 cut

echo "/home/myusername/folder1/folder2/folder3" | cut -d '/' -f4- 

folder1/folder2/folder3

행간이 필요한 경우 줄 끝에 /추가 할 수 | sed 's/^/\//'있습니다.

필드 사이의 구분자 로 사용하도록 지시 하기 -f4-때문에 필요 합니다. 따라서 첫 번째 필드는 첫 번째 구분 기호 앞에옵니다.이 경우 첫 번째 필드는 비어 있습니다. 4 번째 필드도 마찬가지 이며 4 번째부터 모든 필드를 사용하도록 cut에 지시합니다.-d '/'cut/folder1-f4-


7

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"*. 이것을 시도하지 마십시오!


경로는 30 개의 폴더 일 수 있으며 마지막 28 개만 포함하고 싶습니다. 그래도 작동합니까?
pi의 생활

확실히, 이것은 경로의 길이에 관계없이 처음 두 개만 자릅니다.
Arronical
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.