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

How to have SED remove all characters between a hypen and the file extension

我一直在尝试更改此设置,但没有成功

'Simple' week 1-117067638.mp3

进入这个

'Simple' week 1.mp3

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

'Simple' week 1

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

您不需要捕获组。

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

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

你的代码有什么问题?

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

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

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

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