1

这是一个非常简单的正则表达式,它不起作用,我不知道为什么。据此,应该工作。

我在 Mac (OS X 10.8.2) 上。

脚本.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

4 回答 4

3

sed适用于简单的正则表达式。您必须使用反斜杠括号和竖线才能使其正常工作。

sed 's/software-//g;s/-\(licensetypeone\|licensetypetwo\)\.zip//g'

请注意,我也反斜杠了点。否则,它将匹配任何字符。

于 2012-11-12T12:59:24.640 回答
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)
于 2012-11-12T18:09:45.930 回答
2

查看 OS X 10.7.4的正则表达式文档(但应适用于 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. 斩波(参数扩展)

    VERSION=${ZIP#software-}
    VERSION=${VERSION%-license*.zip}
    
  2. sed

    VERSION=$(sed 's/software-\(.*\)-license.*/\1/' <<< "$ZIP")
    

    您不必将字符串与 shell 模式或正则表达式逐字匹配。

于 2012-11-14T03:19:50.657 回答
0
$ man sed | grep "regexp-extended" -A2
       -r, --regexp-extended

              use extended regular expressions in the script.
于 2012-11-12T13:03:08.127 回答