我希望这是一个让我感到困惑的简单问题。我需要使用名称如下的安装程序文件:
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实现不支持它的某些元素。有谁知道我做错了什么?
答案 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