내가 준 echo "/home/user/test/folder" | cut -d'/' -f4-
:
test/folder
하지만 마지막 구분 기호를 유지하고 싶습니다. 예상 결과는 다음과 같습니다.
/test/folder
달성하는 방법 cut
?
답변1
bash 내장 기능만 사용
strip_slashes(){
declare -n stripped=$1
local -i i
stripped=$3
for((i=0;i<$2;i++)) ; do
stripped=${stripped#*/}
done
stripped="/$stripped"
}
이것은 다음과 같이 불린다.
strip_slashes X 3 "/home/user/test/folder"
echo $X
첫 번째 인수는 결과를 보유하는 변수의 이름이고, 그 뒤에는 제거할 슬래시 수, 제거할 슬래시 값이 옵니다.
결과를 저장하기 위해 변수 이름을 전달한다는 것은 이름을 하드코딩할 필요가 없으며(예: 기본적으로 선택 및 읽기에 사용되는 REPLY) 하위 쉘도 필요하지 않음을 의미합니다. 그 다음에는 declare -n
stripped
지정된 변수의 별칭이 옵니다.
sed 솔루션. GNU sed 사용
echo /home/user/test/folder | sed -E 's:(/[^/]*){2}::'
더 휴대하기 편리함
echo /home/user/test/folder | sed 's:/[^/]*/[^/]*::'
답변2
/home/user/test/folder
이것이 일부 변수의 내용 dirpath
이고 현재 사용자의 홈 디렉터리(제공됨)가 $HOME
이라고 가정하면 /home/user
다음 코드는 을 인쇄합니다 Path under $HOME directory is "/test/folder"
.
dirpath=/home/user/test/folder
printf 'Path under $HOME directory is "%s"\n' "${dirpath#$HOME}"
이는 표준 매개변수 확장을 통해 접두사 문자열을 제거함으로써 $HOME
이를 수행합니다 .$dirpath
이는 다음 이외의 경로로 일반화될 수 있습니다 $HOME
.
dirpath=/0/1/2/somewhere/output/test/folder
topdir=${dirpath%/*/*}
printf 'The path under "%s" is "%s"\n' "$topdir" "${dirpath#$topdir}"
그러면 인쇄됩니다 The path under "/0/1/2/somewhere/output" is "/test/folder"
.
값은 표준 인수 대체를 사용하여 끝에서 발생하는 항목을 모두 topdir
제거 하여 /*/*
제공 됩니다. $dirpath
패턴은 /*/*
나중에 끝에서 찾으려는 패턴 $dirpath
(이 경우 경로 이름의 마지막 두 구성 요소) 과 정확히 일치해야 합니다 $dirpath
.
을 찾으면 $topdir
최상위 디렉토리에 대해 했던 것처럼 연습을 반복합니다 $HOME
.
답변3
이제 구분 기호를 알았으므로 다시 추가해도 본질적으로 잘못된 것은 없습니다.
path="/$(echo "/home/user/test/folder" | cut -d'/' -f4-)"
echo "$path"