1

彼ら、

私はたくさん検索しましたが、私の問題に対する望ましい解決策を得ることができません。だから私はここに投稿しなければなりません。

文字列から 2 つの数字を抽出する必要があります。文字列には、解析したい 2 つの数字以外の数字が含まれている場合と含まれていない場合があります。

たとえば、文字列は次のようになります。

newSetupSL5_snolab_Int-300_Exp-10000_3515

snolab_Int-300_Exp-10000_1185

newSetupSL5_snolab_Int-300_Exp-5000_2522

したがって、抽出したいのは、「Int-」と「Exp-」の後の数字で、1 番目と 2 番目の文字列の 300 と 10000、3 番目の文字列の 300 と 5000 に対応します。

さらに、これら 2 つの数値をさらに分析するために使用する必要があります。つまり、コマンド ライン形式ではなく、bash スクリプトで出力するだけでなく、これら 2 つの数値を 2 つの変数に割り当てることができることを願っています。

4

3 に答える 3

4

bash 正規表現マッチングの使用

while read line; do
    if [[ $line =~ _Int-([[:digit:]]+)_Exp-([[:digit:]]+) ]]; then
        printf "int=%d; exp=%d\n" "${BASH_REMATCH[1]}" "${BASH_REMATCH[2]}"
    fi
done <<END
newSetupSL5_snolab_Int-300_Exp-10000_3515
snolab_Int-300_Exp-10000_1185
newSetupSL5_snolab_Int-300_Exp-5000_2522
END
int=300; exp=10000
int=300; exp=10000
int=300; exp=5000

while ループの削除

str=newSetupSL5_snolab_Int-300_Exp-10000_3515
if [[ $line =~ _Int-([[:digit:]]+)_Exp-([[:digit:]]+) ]]; then
    printf "int=%d; exp=%d\n" "${BASH_REMATCH[1]}" "${BASH_REMATCH[2]}"
fi
于 2013-10-16T09:22:45.850 に答える
0

の下では、やその他のような外部ツール ( forks ) を必要としないこの要件を実行する方法がありますsedawk

i=0;
while read string ;do
    ((i++))
    int=${string#*Int-}
    int=(${int//[a-z_-]/ })
    exp=${string#*Exp-}
    exp=(${exp//[a-z_-]/ })
    var=(${string//[a-z_-]/ })
    printf "Line #%2d contain: Int: %6s, Exp: %6s in %2d values: <%s>\n" \
        $i "$int" "$exp" ${#var[@]} "${var[*]}"
  done <<<'
newSetupSL5_snolab_Int-300_Exp-10000_3515

snolab_Int-300_Exp-10000_1185

newSetupSL5_snolab_Int-300_Exp-5000_2522
'
Line # 1 contain: Int:       , Exp:        in  0 values: <>
Line # 2 contain: Int:    300, Exp:  10000 in  4 values: <5 300 10000 3515>
Line # 3 contain: Int:       , Exp:        in  0 values: <>
Line # 4 contain: Int:    300, Exp:  10000 in  3 values: <300 10000 1185>
Line # 5 contain: Int:       , Exp:        in  0 values: <>
Line # 6 contain: Int:    300, Exp:   5000 in  4 values: <5 300 5000 2522>
Line # 7 contain: Int:       , Exp:        in  0 values: <>

またはExp-Int-の両方 を含む行をフィルタリングします。

i=0
while read string ;do
    if [ "$string" != "${string#*Int-*Exp-}" ];then
        ((i++))
        int=${string#*Int-}
        int=(${int//[a-z_-]/ })
        exp=${string#*Exp-}
        exp=(${exp//[a-z_-]/ })
        var=(${string//[a-z_-]/ })
        printf "Line #%2d contain: Int: %6s, Exp: %6s in %2d values: <%s>\n" \
            $i "$int" "$exp" ${#var[@]} "${var[*]}"
      fi
  done <<<'
newSetupSL5_snolab_Int-300_Exp-10000_3515

snolab_Int-300_Exp-10000_1185

newSetupSL5_snolab_Int-300_Exp-5000_2522
'
Line # 1 contain: Int:    300, Exp:  10000 in  4 values: <5 300 10000 3515>
Line # 2 contain: Int:    300, Exp:  10000 in  3 values: <300 10000 1185>
Line # 3 contain: Int:    300, Exp:   5000 in  4 values: <5 300 5000 2522>
于 2013-10-16T09:24:10.413 に答える