【问题标题】:Transforming a path in the shell [closed]在外壳中转换路径[关闭]
【发布时间】:2021-07-03 12:34:02
【问题描述】:

我正在尝试在 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 之前的部分替换为正斜杠,最后一个正斜杠替换为冒号并删除文件扩展名。提前致谢!

【问题讨论】:

  • 如果您要替换的路径部分始终是/Users/nir/MongoDB/GitHub/mms,那么您可以使用substringsconcatenation 将第一部分替换为斜线。
  • @NirJacobson :至少展示你自己解决问题的尝试,并描述你在什么时候卡住了。

标签: macos path zsh


【解决方案1】:

这是一种方法。

设置(在路径中添加空格以进行测试):

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(根)删除扩展:

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

头尾参数展开获取目录名和基名 标志,并添加一个冒号:

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 手册页中。有些 令人困惑的是,参数扩展标志在历史记录中有所描述 扩展部分。

【讨论】: