Bashスクリプトのパターンに基づいて文字列を抽出する

Bashスクリプトのパターンに基づいて文字列を抽出する

Bashに文字列があるとしましょうstrname

strname="ph7go04325r"

抽出したい最初 "3"性格と最後 "r"文字を入力しstrnameて結果を文字列に保存しますstrresult。上記の例では、結果strresultは次のようになります。

strresult="25"

最初の"3"キャラクターはいいえ同様に、文字列の位置8にする必要がありますstrname。最後の項目"r"は次のとおりです。いいえ文字列の位置 11 に配置する必要があります。したがって、次の文字列はすべて次のものをstrname生成する必要がありますstrresult="25"

strname="ph11go04325raa"
strname="325r"
strname="rgo04325raa"

またstrname=ph12go04330raa"作成する必要がありますstrresult="30"

私はbashスクリプトに最初に触れましたが、このような文字列パターンのマッチングをどこから始めるべきかわかりません。おすすめメニューとは何ですか?

答え1

正規表現を使用して、bash(3.0以降)でこれを行うことができます。

if [[ $strname =~ 3(.+)r ]]; then
    strresult=${BASH_REMATCH[1]}
else
    echo "unable to parse string $strname"
fi

Bashでは、正規表現のキャプチャグループが特別な配列に配置されますBASH_REMATCH。要素 0 には完全一致が含まれ、要素 1 には最初のキャプチャグループの一致が含まれます。

答え2

標準sh構文(したがって、すべてのバージョンbashまたは他のPOSIX互換シェルで使用可能)では、次のことができます。

case $strname in
  (*3*r*) 
    strresult=${strname#*3}
    strresult=${strresult%r*};;
  (*)
    printf >&2 '%s\n' "Unable to parse string $strname"
esac

expr35年前のUnicesでも動作する以前のソリューションも参照してください。

expr "x$strname" : 'x[^3]*3\(.*\)r'

長老珍しい点with は、一致が失敗するとゼロ以外の終了状態を取得します(大丈夫です)。ただし、expr返された文字列がゼロと解釈されると(withのように)、ゼロ以外の終了状態も取得されます。strname=zz300rzz

関連情報