Tuyen Pham Asked: 2019-12-29 09:06:48 +0800 CST2019-12-29 09:06:48 +0800 CST 2019-12-29 09:06:48 +0800 CST 剪切但保留最后一个分隔符? 772 我echo "/home/user/test/folder" | cut -d'/' -f4-给了: test/folder 但我想保留最后一个分隔符,预期结果是: /test/folder 如何实现cut? bash cut 3 个回答 Voted Best Answer icarus 2019-12-29T09:44:00+08:002019-12-29T09:44:00+08:00 仅使用 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:/[^/]*/[^/]*::' Kusalananda 2019-12-29T10:33:09+08:002019-12-29T10:33:09+08:00 假设/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. roaima 2019-12-29T12:25:38+08:002019-12-29T12:25:38+08:00 由于您知道分隔符,因此再次添加它本质上没有任何问题。 path="/$(echo "/home/user/test/folder" | cut -d'/' -f4-)" echo "$path"
仅使用 bash 内置函数
这被调用为
第一个参数是保存结果的变量的名称,然后是要删除的斜杠数,以及要从中删除它们的值。
传递变量的名称来保存结果意味着您不需要对名称进行硬编码(例如,默认情况下 select 和 read 使用的 REPLY )也不需要子shell。之后
declare -n
stripped
是命名变量的别名。sed 解决方案。使用 gnu sed
更便携
假设
/home/user/test/folder
是某个变量的内容dirpath
,并且当前用户的主目录(由 给出$HOME
)是/home/user
,那么下面的代码将打印Path under $HOME directory is "/test/folder"
。它通过标准参数扩展来删除
$HOME
前缀字符串来做到这一点。$dirpath
这可以推广到以下路径之外的其他路径
$HOME
:这将打印
The path under "/0/1/2/somewhere/output" is "/test/folder"
.的值是通过从使用标准参数替换的末尾
topdir
删除任何匹配项来给出的。该模式应该与我们稍后想要在 末尾找到的完全匹配,在本例中是路径名的最后两个组成部分。/*/*
$dirpath
/*/*
$dirpath
$dirpath
找到后
$topdir
,我们只是重复练习,就像我们在最上面的目录是$HOME
.由于您知道分隔符,因此再次添加它本质上没有任何问题。