Ben*_*ley 4 zsh regex batch-rename
我正在尝试手动从 Rails 资产中提取摘要(不要问)。我被引导到 ZMV 以轻松进行基于正则表达式的查找/替换。但是{32}用于指定重复量的正常语法不起作用:
$ zmv -n '(**/)(*)' '$1${2//-[A-Za-z0-9]\{32\}/}'
Run Code Online (Sandbox Code Playgroud)
我尝试了一些其他格式。这一点,例如,工作,但就是太贪了(它会变成image-3.png成image.png为例):
$ zmv -n '(**/)(*)' '$1${2//-[A-Za-z0-9]##\./.}'
Run Code Online (Sandbox Code Playgroud)
这种双散列语法仅在大量谷歌搜索后才出现(我已经预料到了+)。但我终其一生都无法找到如何{32}工作。我试过#32#?这似乎有效,但那是因为它正在阅读它(在我看来)?32?,这意味着它遇到了摘要或最后一个字符中包含 3 的任何内容。
我如何表示 zmv 中的字符重复?
编辑:
显然,查看我试图匹配的文件名会有所帮助吗?要清楚:我的问题是“我如何表示 zmv 中的字符重复” 而不是“我如何匹配这些文件名”(我知道标准 RegEx 格式的答案的问题)。如果有帮助,这是我之前和之后的打算:
directory/asset-jej4jtifne9bjkkeuwr09rewrewlur23.css
another-directory/style-748reiodlpqwerntaerwerwerexfzsdf.js.gz
directory/subdirectory/this-is-a-thing-qwertyuiopasdfghjklzxcvbnm123456.js
third-directory/should-not-match-3.css
Run Code Online (Sandbox Code Playgroud)
应该变成:
directory/asset.css
another-directory/style.js.gz
directory/subdirectory/this-is-a-thing.js
third-directory/should-not-match-3.css
Run Code Online (Sandbox Code Playgroud)
第二次编辑:
因为我昨天需要这样做,所以我做了很长的路并且(正如预期的那样)它奏效了。我仍然想知道将来如何避免它。这是我最终使用的命令(我明确地重复了我的字符匹配器 32 次):
$ zmv '(***/)(*)' '$1${2//-[A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9]/}'
Run Code Online (Sandbox Code Playgroud)
第三次编辑:
为了记录,我在 OS X 上使用 zsh。我想 zmv 跨平台是相同的,但我不能肯定地说。
Shell 大多不提供通常的正则表达式语法,而是提供通配符“glob”模式。基本的 shell 通配符不如正则表达式强大;例如,regexp .*(任何字符序列)等效于 glob 模式,*但 regexp a*(任何a's序列)在纯 sh 中没有等效的 glob 模式。请参阅为什么我的正则表达式在 X 中有效但在 Y 中无效?有关主要不同正则表达式/模式语法的概述。
Zsh 具有zsh 扩展的 glob 模式,它提供与正则表达式相同的表达能力,但语法不同。这些模式zmv在完成函数中和完成函数中自动启用,但在 zsh 的其他地方需要显式启用它们setopt extended_glob(将其放入您的.zshrc- 它不是默认值的唯一原因是与旧版本的 zsh 向后兼容)。
有一个重复 N 次语法,但它有点隐藏,列在globbing 标志下,而不是在运算符列表下。它是c标志,必须单独使用,后跟重复次数(或两个逗号分隔的数字以给出范围)。
zmv -n '(**/)(*)' '$1${2//-[A-Za-z0-9](#c32)/}'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1437 次 |
| 最近记录: |