剪切但保留最后一个分隔符?

剪切但保留最后一个分隔符?

我已经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"

相关内容