我已经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
第一个参数是保存结果的变量名称,然后是要删除的斜杠数量,以及要从中删除斜杠的值。
传递变量的名称来保存结果意味着您不需要对名称进行硬编码(例如默认情况下由 select 和 read 使用的 REPLY),也不需要子 shell。之后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"