从文件名中删除特定(已知)扩展名(如果存在)

从文件名中删除特定(已知)扩展名(如果存在)

我什至不确定是否grep要用于单行数据中的正则表达式。谷歌搜索让我找到了这个前瞻表达式,它与 一起grep匹配任何.ext文件并返回裸名称:

XX@XX:/$ echo name.ext | grep -oP [^\.]+(?=.ext)
name

这很好,但现在我提示用户保存文件,我不确定他是否会输入带有扩展名的名称。我尝试将先行设置为有条件的,确保所有名称都匹配,但这会返回我不明白的内容:

XX@XX:/$ echo name.ext | grep -oP "[^\.]+(?=.ext)?"
name
ext

如果我省略扩展名,它会起作用:

XX@XX:/$ echo name | grep -oP "[^\.]+(?=.ext)?"
name

那么这是 grep 问题还是正则表达式问题?也许我需要以某种方式使前瞻不捕获?

答案1

您可以使用 POSIX shell 替换来删除.ext

file='name.ext'
printf '%s\n' "${file%.ext}"

要将扩展自由字符串分配给新变量,请执行以下操作

noext="${file%.ext}"

答案2

使用您的方法(有更好的解决方案):

echo name | grep -oP '^[^.]+(?=(\.ext)?$)'

相关内容