【问题标题】:Renaming using capture groups in Bash在 Bash 中使用捕获组重命名
【发布时间】:2014-07-09 19:56:51
【问题描述】:

我想重命名几个格式的文件

libabc-x86_64-gnu-linux.a
libasdfgh-x86-gnu-linux.a

全部格式

libabc.a
libasdfgh.a

使用 Bash。我已经编写了正则表达式 (libpj[^-]*).*,它应该将有趣的部分留在捕获组 1 中。所以我尝试使用 Bash 的参数替换:

for i in `ls *.a`; do mv "$i" "${i/(lib[^-]*).*/\1}"; done

但是 Bash 给出了很多形式的错误

mv: 'libabc-x86_64-gnu-linux.a' and 'libabc-x86_64-gnu-linux.a' are the same file

暗示正则表达式在某种程度上不匹配,尽管我已经确认它与几个实用程序一起使用,尤其是非常出色的RegExr。我究竟做错了什么? Bash 在捕获组方面有问题吗?

【问题讨论】:

    标签: regex bash


    【解决方案1】:

    你可以使用:

    for i in *.a; do
       mv "$i" "${i%%-*}.a"
    done
    

    %% 将删除匹配的后缀模式;在这种情况下,它会删除 -*,或从第一个 - 开始的所有内容。

    【讨论】:

    • 这在man bash 中的Parameter Expansion 部分中有介绍
    • 比我的干净多了。我早就断定 Bash 具有无限的功能,而 Bash 手册页实际上就是《沙之书》。谢谢!
    猜你喜欢
    • 2019-11-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-08
    • 1970-01-01
    • 2019-09-02
    • 1970-01-01
    • 2014-06-26
    • 1970-01-01
    相关资源
    最近更新 更多