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