regex - 使用 BASH 转换文件名中的最后一个连字符

标签 regex linux bash shell sed

我的任务是执行一个重要的文件重命名项目。我将重命名的其中一些文件包含多个连字符。我需要将名称中的最后一个连字符换成下划线,以便将文件重命名为我们的新命名约定。

谁能给我解释一下为什么下面的测试代码中最后一个连字符没有被替换为下划线?

#!/bin/bash

image_name="i-need-the-last-hyphen-removed.psd"

echo -e "Normal: ${image_name}"
echo "Changed: ${image_name/%-/_}"

我正在寻找的输出应该模仿以下内容:

Normal: i-need-the-last-hyphen-removed.psd
Changed: i-need-the-last-hyphen_removed.psd

脚本逻辑是根据此处找到的以下文档创建的:http://tldp.org/LDP/abs/html/string-manipulation.html

我曾尝试摆脱炒作,但效果不佳。我已经放弃了,与我过去使用的 SED 和/或 BASH_REMATCH 解决方案相比,这将被证明是最优雅的解决方案。

任何帮助都会很棒。先感谢您。

最佳答案

我建议使用重命名工具来完成此类任务。它与 sed 模式相似。

rename 's/(.*)-/$1_/' *.psd  

由于 .* 是贪婪的,这样最后一个 '-' 将被捕获,其中 (.*) 被捕获到组中。右边部分不会改变。

使用 *.psd 您将捕获当前文件夹中的所有 psd 文件

关于regex - 使用 BASH 转换文件名中的最后一个连字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30859393/

相关文章:

javascript - jQuery 使用 IFRAME 内容中的 RegEx

javascript - 为什么 "asdf".replace(/.*/g, "x") == "xx"?

linux - 如果主线程完成,C++ 程序在什么情况下会继续?

javascript - 当我将 grep 与 Node child_process 一起使用时,结果与 bash 中不同

bash - Ubuntu 中的重定向器 "<<<"?

javascript - 可选的结束捕获组

Javascript 正则表达式原型(prototype)

c++ - 从 Linux 到 Windows 交叉编译时应该如何处理字符编码?

linux - 如何在 Ubuntu 中配置 openvpn

linux - 将 cron 日志存储在 timedate 文件中