我试图在'/'
之前和之后编写一个回音字符串的脚本示例输入
/Library/Users/foo.txt
现在我需要两个输出
/Library/Users
foo.txt
我如何获得这些输出
答案 0 :(得分:5)
使用dirname
和basename
:
$ dirname /Library/Users/foo.txt
/Library/Users
$ basename /Library/Users/foo.txt
foo.txt
答案 1 :(得分:1)
dirname& basename是/ bin中的独立程序。这可以更有效地完成,完全在使用内置变量替换的bash中 - 没有不必要的exec到dirname或basename。
使用$ { var%re }从 var 中删除尾随的正则表达式,并使用$ { var ## re }来从var:
开始剥离$ path=/Libarary/Users/foo.txt
$ dir=${path%/*}
$ base=${path##*/}
$ echo $path : basename is $base and dir is $dir
/Library/Users/foo.txt : basename is foo.txt and dir is /Library/Users
答案 2 :(得分:0)
使用awk
awk -F/ '{$NF=x;sub(/\/$/,x)}1' OFS=/
/Library/Users
awk -F/ '{print $NF}'
foo.txt
答案 3 :(得分:0)
falsetru的答案将启动2个进程。如果性能是一个问题 可以使用参数替换,例如
path="/Library/Users/foo.txt"
dir="${path%/*}"
base="${path##*/}"
或
echo "${path%/*}"
echo "${path##*/}"