私は変数を持っています
string="ABC400p2q4".
ABC400
とをどのように分離できますかp2q4
。結果として得られるように、それを2つの変数に分ける必要があります
echo $var1
ABC400
echo $var2
p2q4
ABC の代わりに任意の英字を使用できます。400 の代わりに他の数字を使用できます。ただしp
、 とq
は固定されており、2 と 4 の代わりに任意の数字を使用できます。
固定長の部分文字列であるため、正規表現パターンに基づいて分割する必要はありません。純粋bash
に次のようにします。
$ string="ABC400p2q4"
$ var1=${string:0:6}
$ var2=${string:6}
$ echo $var1
ABC400
$ echo $var2
p2q4
bashと特別なBASH_REMATCH
配列 (非固定長)の使用:
$ string='ABC400p2q4'
$ [[ $string =~ ^([a-zA-Z]+[0-9]+)(.*) ]]
$ echo ${BASH_REMATCH[1]}
ABC400
$ echo ${BASH_REMATCH[2]}
p2q4
read var1 var2 < <(sed -r 's/^[a-zA-Z]+[0-9]+/& /' <<< 'ABC400p2q4')
またはこれはhere-stringを使用します
read var1 var2 <<< $(sed -r 's/^[a-zA-Z]+[0-9]+/& /' <<< 'ABC400p2q4')
またはケントからの短いsed substitution
バージョンで
's/([0-9])p/\1 p/'
&
コマンド内は、置換sed
の一致する左側の部分を表します s///
$ echo $var1
ABC400
$ echo $var2
p2q4
sudo_O が提供する答えは、文字列が単一の長さのままである場合に最適です。しかし、そうでない場合、bash は文字列の正規表現に一致する builtinsを提供します。
$ string="ABC400p2q4"
$ var1=$( expr match "$string" '\(.{6}\)' )
$ var2=$( expr match "$string" '.*\(.{4}\)' )
正規表現を実際に必要なものに置き換えます。