转换 shell 中的路径

Transforming a path in the shell

我正在尝试在 macOS 中转换 shell 中的路径。有谁知道如下转换路径的快速命令?

路径: /Users/nir/MongoDB/GitHub/mms/server/src/unit/com/xgen/svc/nds/aws/model/AWSShardedClusterDescriptionUnitTests.java

结果: //server/src/unit/com/xgen/svc/nds/aws/model:AWSShardedClusterDescriptionUnitTests

/server 之前的部分替换为正斜杠,最后一个正斜杠替换为冒号,并删除文件扩展名。提前致谢!

这是一种方法。

设置(在测试路径中添加了空格):

input='/Users/user/server/sub/dir s/fil e.java'
expect='//server/sub/dir s:fil e'
p=$input
printf 'before:    "%s"\n' $p

使用zsh参数扩展标志:r(root)删除扩展:

p=${p:r}
printf 'root:      "%s"\n' $p

通过head和tail参数扩展得到dirname和basename 标志,并添加一个冒号:

p=${p:h}:${p:t}
printf 'head/tail: "%s"\n' $p

删除第一次出现的字符串 server 和它之前的所有内容, 然后添加 //server:

p=//server${p#*server}
printf 'subst:     "%s"\n' $p
[[ $p == $expect ]] && print 'It worked.' || print 'Error.'

将所有内容合并成一行:

p=$input
p=//server${${p:h}#*server}:${p:t:r}
printf 'all:       "%s"\n' $p
[[ $p == $expect ]] && print 'Also worked.' || print 'Error.'

输出:

before:    "/Users/user/server/sub/dir s/fil e.java"
root:      "/Users/user/server/sub/dir s/fil e"
head/tail: "/Users/user/server/sub/dir s:fil e"
subst:     "//server/sub/dir s:fil e"
It worked.
all:       "//server/sub/dir s:fil e"
Also worked.

大多数这些运算符都记录在 zshexpn 手册页中。有些 令人困惑的是,参数扩展标志在历史记录中有描述 扩展部分。