잘라내되 마지막 구분 기호는 유지하시겠습니까?

잘라내되 마지막 구분 기호는 유지하시겠습니까?

내가 준 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"

관련 정보