为什么这个简单的RegEx不适用于sed?

时间:2012-11-12 12:51:44

标签: regex sed

这是一个非常简单的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

4 个答案:

答案 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扩展名。


提取版本号的其他方法

  1. chop-chop(参数扩展)

    VERSION=${ZIP#software-}
    VERSION=${VERSION%-license*.zip}
    
  2. 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.