4

私は変数を持っています

string="ABC400p2q4".

ABC400とをどのように分離できますかp2q4。結果として得られるように、それを2つの変数に分ける必要があります

echo $var1
ABC400
echo $var2
p2q4

ABC の代わりに任意の英字を使用できます。400 の代わりに他の数字を使用できます。ただしp、 とqは固定されており、2 と 4 の代わりに任意の数字を使用できます。

4

4 に答える 4

6

固定長の部分文字列であるため、正規表現パターンに基づいて分割する必要はありません。純粋bashに次のようにします。

$ string="ABC400p2q4"

$ var1=${string:0:6}

$ var2=${string:6}

$ echo $var1
ABC400

$ echo $var2
p2q4
于 2013-03-14T13:09:07.477 に答える
5

と特別なBASH_REMATCH配列 (非固定長)の使用:

$ string='ABC400p2q4'
$ [[ $string =~ ^([a-zA-Z]+[0-9]+)(.*) ]]
$ echo ${BASH_REMATCH[1]}
ABC400
$ echo ${BASH_REMATCH[2]}
p2q4
于 2013-03-14T13:26:17.097 に答える
3

これをやってみてください

プロセス置換を使用する(固定長ではない):

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
于 2013-03-14T13:00:30.813 に答える
2

sudo_O が提供する答えは、文字列が単一の長さのままである場合に最適です。しかし、そうでない場合、bash は文字列の正規表現に一致する builtinsを提供します。

$ string="ABC400p2q4"

$ var1=$( expr match "$string" '\(.{6}\)' )

$ var2=$( expr match "$string" '.*\(.{4}\)' )

正規表現を実際に必要なものに置き換えます。

于 2013-03-14T13:28:02.230 に答える