这是一个非常简单的RegEx无法正常工作,我无法弄清楚原因。根据{{3}},它应该有效。
我在Mac上(OS X 10.8.2)。
script.sh
#!/bin/bash
ZIP="software-1.3-licensetypeone.zip"
VERSION=$(sed 's/software-//g;s/-(licensetypeone|licensetypetwo).zip//g' <<< $ZIP)
echo $VERSION
终端
$ sh script.sh
1.3-licensetypeone.zip
答案 0 :(得分:3)
sed
适用于简单的正则表达式。你必须反斜杠括号和一个垂直条才能使它工作。
sed 's/software-//g;s/-\(licensetypeone\|licensetypetwo\)\.zip//g'
请注意,我也反映了点。否则,它会匹配任何角色。
答案 1 :(得分:3)
你可以在shell中执行此操作,不需要sed,参数扩展就足够了:
shopt -s extglob
ZIP="software-1.3-licensetypeone.zip"
tmp=${ZIP#software-}
VERSION=${tmp%-licensetype@(one|two).zip}
使用最新版本的bash(可能不附带OSX),您可以使用正则表达式
if [[ $ZIP =~ software-([0-9.]+)-licensetype(one|two).zip ]]; then
VERSION=${BASH_REMATCH[1]}
fi
或者,如果您只想要连字符分隔字符串中的第二个单词
VERSION=$(IFS=-; set -- $ZIP; echo $2)
答案 2 :(得分:2)
查看OS X 10.7.4的regex documentation(但应该适用于OP的10.8.2),在最后一段中提到了
过时(基本)正则表达式在几个方面有所不同。
|
是一个普通的角色,其功能没有相应的.........嵌套子表达式的括号为
\(' and
)'...
sed
,没有任何选项,使用基本正则表达式(BRE)。
要在OS X或BSD的|
中使用sed
,您需要通过-E
选项启用扩展正则表达式(ERE),即
sed -E 's/software-//g;s/-(licensetypeone|licensetypetwo).zip//g'
p / s:BRE中的\|
是GNU扩展名。
提取版本号的其他方法
chop-chop(参数扩展)
VERSION=${ZIP#software-}
VERSION=${VERSION%-license*.zip}
sed
VERSION=$(sed 's/software-\(.*\)-license.*/\1/' <<< "$ZIP")
您不一定要逐字逐句地将字符串与shell模式或正则表达式匹配。
答案 3 :(得分:0)
$ man sed | grep "regexp-extended" -A2
-r, --regexp-extended
use extended regular expressions in the script.