使用BASH

时间:2015-06-16 05:22:54

标签: 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解决方案相比,这将被证明是最优雅的解决方案。

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

4 个答案:

答案 0 :(得分:2)

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

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

因为。*是贪婪的,所以这种方式最后' - '将被捕获​​,其中(。*)被捕获在组中。正确的部分不会改变。

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

答案 1 :(得分:1)

非常感谢@ alex-p提出以下建议。正如我最初所说,我不想使用SED或BASH_REMATCH或任何其他复杂的REGEX。这完美无缺。

echo" $ {image_name% - } _ $ {image_name ## - }"

答案 2 :(得分:0)

如果${image_name/%-/_}"-的终止/后缀(例如在$image_name中),则

mystring-只会 。< / p>

尝试使用sed:

$> echo i-need-the-last-hyphen-removed.psd | sed -r 's/-([^-]*$)/_\1/'
i-need-the-last-hyphen_removed.psd

答案 3 :(得分:0)

您可以使用sed执行此操作:

sed -r "s/(.*)-(.*)/\1_\2/"

这将有两个被捕获的组(1.上一个-之后的2.在最后-之后}将与_连接 或

sed -r "s/-([^-]*$)/_\1/"

这将有一个被捕获的组,它将-替换为_,然后最终将连接捕获的组。