如何让SED删除连字符和文件扩展名之间的所有字符

时间:2015-01-30 01:24:51

标签: sed

我一直在努力改变这个

'Simple' week 1-117067638.mp3

进入这个

'Simple' week 1.mp3

然而,当我使用命令sed 's/\(-\).*\(.mp3\)//'时,我得到了

'Simple' week 1

如何保留文件扩展名?如果你能解释一下你使用的命令,那将是很好的,这样我就可以从中学习,而不仅仅是得到一个答案。

2 个答案:

答案 0 :(得分:1)

您不需要拥有捕获组。

$ echo "'Simple' week 1-117067638.mp3" | sed 's/-.*\.mp3/.mp3/g'
'Simple' week 1.mp3

OR

$ echo "'Simple' week 1-117067638.mp3" | sed 's/-.*\(\.mp3\)/\1/g'
'Simple' week 1.mp3

您的代码有什么问题?

sed 's/\(-\).*\(.mp3\)//'

sed会将所有匹配的字符替换为替换部分中的字符。因此\(-\).*\(.mp3\)匹配-.mp3的所有字符(您必须按顺序转义点以匹配文字点)。您正在用空字符串替换所有匹配的字符。所以.mp3也被删除了。为了避免这种情况,请将.mp3添加到替换部件中。  在基本sed中,捕获组由\(..\)表示。此捕获组用于捕获稍后要引用的字符。

答案 1 :(得分:0)

此任务也可以在bash中完成,无需调用sed

$ fname="'Simple' week 1-117067638.mp3"
$ fname="${fname/-*/}.mp3"
$ echo "$fname"
'Simple' week 1.mp3