1

これは機能しない非常に単純な RegEx であり、その理由がわかりません。thisによると、動作するはずです。

私は 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

4 に答える 4

3

sed単純な正規表現で動作します。機能させるには、括弧と垂直バーをバックスラッシュする必要があります。

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

ドットもバックスラッシュしたことに注意してください。それ以外の場合は、任意の文字に一致します。

于 2012-11-12T12:59:24.640 に答える
3

シェルでこれを行うことができます。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

または、ハイフンで区切られた文字列の 2 番目の単語だけが必要な場合

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拡張正規表現 (ERE) を有効にする必要があります。-E

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")
    

    文字列を単語ごとにシェルパターンまたは正規表現と必ずしも一致させる必要はありません。

于 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 に答える