【问题标题】:Using rename tool to remove a character that is before an uppercase letter使用重命名工具删除大写字母之前的字符
【发布时间】:2020-02-19 14:06:37
【问题描述】:

我在脚本中犯了一个错误,将所有空格替换为“s”而不是下划线。我想撤消此更改。我有这样的名字:

BatmansBegins
FightsClub
ThesDeparted
TouchsOfsEvil

我想把它命名为

Batman_Begins
Fight_Club
The_Departed
Touch_Of_Evil

我现在有这个命令,但它替换了 's' 和它后面的大写字母

rename -n 's/s[A-Z]/_/g'

【问题讨论】:

    标签: linux bash command-line rename


    【解决方案1】:

    您需要捕获大写字母并在替换中使用反向引用。所以将其用作:

    rename -n 's/s([A-Z])/_$1/g' *s[A-Z]*
    

    另一种选择是在您的正则表达式中使用积极的前瞻:

    rename -n 's/s(?=[A-Z])/_/g' *s[A-Z]*
    

    (?=[A-Z]) 是肯定的前瞻,它在匹配 s 后断言存在大写字母。

    PS:rename 工具有很多变体,看来您正在使用流行的基于 perl 的 rename 实用程序,这个答案也是基于此。

    【讨论】:

    • 也许注意到有一个英制立方光年的不同rename 工具。 “规范”是一种流行的 Perl 工具;这显然是这个答案的前提。
    • *s[A-Z]* 也匹配 file.sh
    • 它与 OP 使用的相同,即基于 perl 的rename 工具。
    • @Cyrus: 至少在我的 OSX 文件系统上*s[A-Z]* 不匹配file.sh
    • @anubhava:我发现了我的错误。 LC_COLLATE="en_US.UTF-8" 是问题所在。如果我切换到LC_COLLATE="C",它工作正常。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2020-05-21
    • 2021-08-20
    • 2016-10-16
    • 2012-12-23
    • 1970-01-01
    • 2017-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多