切り取りますが、最後の区切り文字は維持しますか?

切り取りますが、最後の区切り文字は維持しますか?

私が与えた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(この場合はパス名の最後の2つのコンポーネント)と正確に一致する必要があります$dirpath

を見つけたら、$topdir最上位ディレクトリに対して行ったように練習を繰り返します$HOME

答え3

これで区切り文字がわかったので、再度追加しても本質的に間違ったことはありません。

path="/$(echo "/home/user/test/folder" | cut -d'/' -f4-)"
echo "$path"

関連情報