zmv - 如果有多个连续的大写字母则不改变大小写
zmv - do not change case if there are more than one consecutive uppercase letters
我正在使用
zmv -n -Q '(**/)(*[[:upper:]]*)(/)' '${(L)${2//(#b)([[:upper:]])/-$match[1]}#-}'
改造
% tree
.
├── EmptyFile.txt
├── FirstDirectoryName
│ ├── FourthDirectoryName
│ ├── secondDirectoryName
│ └── thirdDirectoryName
├── FourthDirectoryName
├── secondDirectoryName
└── thirdDirectoryName
到
% tree
.
├── EmptyFile.txt
├── first-directory-name
│ ├── fourth-directory-name
│ ├── second-directory-name
│ └── third-directory-name
├── fourth-directory-name
├── second-directory-name
└── third-directory-name
不过有个小问题
如果有多个连续的大写字母,我不想小写。我只想把 -
放在大写字母后面,因为它不在开头。
% tree
.
├── DDDDDDD
├── FirstFolderToRename
│ ├── DDDDDDD
│ └── ThisIsDDDDD
├── secondFolderToRename
│ ├── DDDDDDD
│ └── ThisIsDDDDD
└── ThisIsDDDDD
当前输出
% zmv -n -Q '(**/)(*[[:upper:]]*)(/)' '${(L)${2//(#b)([[:upper:]])/-$match[1]}#-}'
mv -- FirstFolderToRename/DDDDDDD FirstFolderToRename/d-d-d-d-d-d-d
mv -- FirstFolderToRename/ThisIsDDDDD FirstFolderToRename/this-is-d-d-d-d-d
mv -- secondFolderToRename/DDDDDDD secondFolderToRename/d-d-d-d-d-d-d
mv -- secondFolderToRename/ThisIsDDDDD secondFolderToRename/this-is-d-d-d-d-d
mv -- DDDDDDD d-d-d-d-d-d-d
mv -- FirstFolderToRename first-folder-to-rename
mv -- secondFolderToRename second-folder-to-rename
mv -- ThisIsDDDDD this-is-d-d-d-d-d
预期输出
mv -- FirstFolderToRename/DDDDDDD FirstFolderToRename/DDDDDDD
mv -- FirstFolderToRename/ThisIsDDDDD FirstFolderToRename/this-is-DDDDD
mv -- secondFolderToRename/DDDDDDD secondFolderToRename/DDDDDDD
mv -- secondFolderToRename/ThisIsDDDDD secondFolderToRename/this-is-DDDDD
mv -- DDDDDDD DDDDDDD
mv -- FirstFolderToRename first-folder-to-rename
mv -- secondFolderToRename second-folder-to-rename
mv -- ThisIsDDDDD this-is-DDDDD
指定 one or more upper case characters
。那是 [[:upper:]]##
与 zsh 的扩展 globbing(zmv 使用)。 ##
类似于正则表达式 +
量词。单个 #
是 zero or more
,类似于正则表达式 *
.
zmv -n -Q '(**/)(*[[:upper:]]*)(/)' '${(L)${2//(#b)([[:upper:]]##)/-$match[1]}#-}'
可选地,单独转换前导大写字符,而不是之后删除首字母 -
:
${(LM)2##[[:upper:]]#}${(L)${2##[[:upper:]]#}//(#b)([[:upper:]]##)/-$match[1]}
function CamelOrPascalToKebab() {
zmv -Q '(**/)(*[A-Z]*)(/)' '${2//(#b)([a-z])([A-Z])/$match[1]-$match[2]}'
zmv -Q '(**/)(*[A-Z][a-z]*)(/)' '${2//(#m)[A-Z][a-z]/${(L)MATCH}}'
}
我正在使用
zmv -n -Q '(**/)(*[[:upper:]]*)(/)' '${(L)${2//(#b)([[:upper:]])/-$match[1]}#-}'
改造
% tree
.
├── EmptyFile.txt
├── FirstDirectoryName
│ ├── FourthDirectoryName
│ ├── secondDirectoryName
│ └── thirdDirectoryName
├── FourthDirectoryName
├── secondDirectoryName
└── thirdDirectoryName
到
% tree
.
├── EmptyFile.txt
├── first-directory-name
│ ├── fourth-directory-name
│ ├── second-directory-name
│ └── third-directory-name
├── fourth-directory-name
├── second-directory-name
└── third-directory-name
不过有个小问题
如果有多个连续的大写字母,我不想小写。我只想把 -
放在大写字母后面,因为它不在开头。
% tree
.
├── DDDDDDD
├── FirstFolderToRename
│ ├── DDDDDDD
│ └── ThisIsDDDDD
├── secondFolderToRename
│ ├── DDDDDDD
│ └── ThisIsDDDDD
└── ThisIsDDDDD
当前输出
% zmv -n -Q '(**/)(*[[:upper:]]*)(/)' '${(L)${2//(#b)([[:upper:]])/-$match[1]}#-}'
mv -- FirstFolderToRename/DDDDDDD FirstFolderToRename/d-d-d-d-d-d-d
mv -- FirstFolderToRename/ThisIsDDDDD FirstFolderToRename/this-is-d-d-d-d-d
mv -- secondFolderToRename/DDDDDDD secondFolderToRename/d-d-d-d-d-d-d
mv -- secondFolderToRename/ThisIsDDDDD secondFolderToRename/this-is-d-d-d-d-d
mv -- DDDDDDD d-d-d-d-d-d-d
mv -- FirstFolderToRename first-folder-to-rename
mv -- secondFolderToRename second-folder-to-rename
mv -- ThisIsDDDDD this-is-d-d-d-d-d
预期输出
mv -- FirstFolderToRename/DDDDDDD FirstFolderToRename/DDDDDDD
mv -- FirstFolderToRename/ThisIsDDDDD FirstFolderToRename/this-is-DDDDD
mv -- secondFolderToRename/DDDDDDD secondFolderToRename/DDDDDDD
mv -- secondFolderToRename/ThisIsDDDDD secondFolderToRename/this-is-DDDDD
mv -- DDDDDDD DDDDDDD
mv -- FirstFolderToRename first-folder-to-rename
mv -- secondFolderToRename second-folder-to-rename
mv -- ThisIsDDDDD this-is-DDDDD
指定 one or more upper case characters
。那是 [[:upper:]]##
与 zsh 的扩展 globbing(zmv 使用)。 ##
类似于正则表达式 +
量词。单个 #
是 zero or more
,类似于正则表达式 *
.
zmv -n -Q '(**/)(*[[:upper:]]*)(/)' '${(L)${2//(#b)([[:upper:]]##)/-$match[1]}#-}'
可选地,单独转换前导大写字符,而不是之后删除首字母 -
:
${(LM)2##[[:upper:]]#}${(L)${2##[[:upper:]]#}//(#b)([[:upper:]]##)/-$match[1]}
function CamelOrPascalToKebab() {
zmv -Q '(**/)(*[A-Z]*)(/)' '${2//(#b)([a-z])([A-Z])/$match[1]-$match[2]}'
zmv -Q '(**/)(*[A-Z][a-z]*)(/)' '${2//(#m)[A-Z][a-z]/${(L)MATCH}}'
}