尝试使用OSX中的sed从字符串中删除版本号

时间:2015-10-06 10:44:26

标签: regex macos bash sed

我希望这是一个让我感到困惑的简单问题。我需要使用名称如下的安装程序文件:

installer_v0.29_linux.run
installer_v10.22_linux_x64.run
installer_v1.1_osx.app
installer_v5.6_windows.exe

并将其压缩成格式为

的文件
installer_linux.zip
installer_linux_x64.zip
installer_osx.zip
installer_windows.zip

我已经在OSX上运行了一个bash脚本,它在构建链中几乎完成了我需要的所有其他工作,并且确定我可以使用sed来实现这一点:

ZIP_NAME=`echo "$OUTPUT_NAME" | sed -E 's/_(?:\d*\.)?\d+//g'`

也就是说,用空格替换正则表达式_(?:\d*\.)?\d+ - 正则表达式匹配任何以下划线开头的十进制数字。

但是,当我尝试运行此错误时,我收到错误RE error: repetition-operator operand invalid。在这个阶段,我很难过 - 我用Google搜索了一下,看不出我做错了什么。我写的正则表达式在Regexr上正常工作,但显然OSX中的sed实现不支持它的某些元素。有谁知道我做错了什么?

3 个答案:

答案 0 :(得分:1)

您可以试试sed

sed 's/_v[^_]*//; s/\.[[:alnum:]]\+$/.zip/' file
installer_linux.zip
installer_linux_x64.zip
installer_osx.zip
installer_windows.zip

答案 1 :(得分:1)

您不需要sed,只需要一些具有扩展模式的参数扩展魔法。

shopt -s extglob
zip_name=${OUTPUT_NAME/_v+([^_])/}

模式_v+([^_])匹配以_v开头的字符串以及直到下一个_的所有字符。 extglob选项允许使用+(...)模式匹配封闭模式的一个或多个匹配项(在本例中为非_字符)。参数展开${var/pattern/}$var的展开中删除给定模式的第一次出现。

答案 2 :(得分:0)

也尝试这种方式

sed 's/_[^_]\+//' FileName

<强>输出:

installer_linux.run
installer_linux_x64.run
installer_osx.app
installer_windows.exe

如果您想添加替换zip而不是run,请使用以下方法

sed 's/\([^_]\+\).*\(_.*\).*/\1\2.zip/' Filename

输出

installer_linux.run.zip
installer_x64.run.zip
installer_osx.app.zip
installer_windows.exe.zip