私が与えた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"