我正在使用 Bash。我有一些路径字符串,例如/dir0/dir1/dir2/filename.ext
,我想在 bash 中提取字符串dir2
。您可以假设我想要提取的单词位于最后两个/
字符之间。
我正在尝试结合##
,%
但效果不佳。
我尝试过但没有效果的是cut=${${path%/*}##*/}
。
我怎样才能做到这一点?
解决了但寻找备择方案。我的解决方案如下:
cut=$(tmp=${path%/*}; echo ${tmp##*/})
答案1
使用 bash 和正则表达式:
s="/dir0/dir1/dir2/filename.ext"
[[ $s =~ ([^/]*)/[^/]*$ ]] && echo "${BASH_REMATCH[1]}"
输出:
目录2
答案2
另一种方法是使用 Bash(也是两步)。
IFS=/ read -a array <<<'/dir0/dir1/dir2/filename.ext'
echo ${array[ $(( ${#array[@]}-2 )) ]}
dir2
答案3
您需要分阶段进行解析:-
path=/dir0/dir1/dir2/filename.ext
dir=${path%/*}
lastdir=${dir##*/}
通过尝试结合两种解析操作,您尝试在第二次扩展中使用字符串而不是变量:这是不受支持的。
dir
请注意,您可以对和使用相同的变量名lastdir
,例如:-
cut=${path%/*}; cut=${cut##*/}
您没有说您的 shell 是bash
,但我从您的代码示例中假设了这一点。
答案4
使用 awk 解决:
echo "/dir0/dir1/dir2/filename.ext" | awk -F'/' '{print $(NF-1)}'
上面的输出将是:
dir2