2017-10-27 7 views
1

後、私はこのようないくつかの文字列を持っている:これらの文字列は、(私は触れることは許されないのです)Pythonスクリプトの出力ですバッシュ:、文字列の一部を抽出数

var1="string one=3423423 and something which i don't care" 
var2="another bigger string=413145 and something which i don't care" 
var3="the longest string ever=23442 and something which i don't care" 

をし、私は数字の直後に文字列の最初の部分を抽出する方法が必要です。基本的に、私の出力は次のようになります。あなたが見ることができるように、私はそのような位置、またはものを使用することはできません

"string one=3423423" 
"another bigger string=413145" 
"the longest string ever=23442" 

、数や文字列の長さは必ずしも同じではありませんので。私は、正規表現や何かを使用する必要があると仮定しますが、私は正規表現を本当に理解していません。あなたはこれを行うことができるコマンドまたは何かを手伝ってもらえますか?

答えて

0

次の例のように、パラメータ展開を使用することができます。${var1%%=*}

var1="string one=3423423 and something which i don't care" 
name=${var1%%=*} 
value=${var1#*=} 
value=${value%%[^0-9]*} 
echo "$name=$value" 
# prints: string one=3423423 

説明:

  • %% - 試合=
  • * - - 試合最長一致サフィックス
  • =を削除しますすべて

説明${var1#*=}の:

  • # - - 一致するすべて
  • = - 試合=

説明${value%%[^0-9]*}の最短一致する接頭辞

  • *を削除3210
    • %% - 、簡単に複数の値に同じことを実行するには、あなたは可能性が に一致するすべてのもの

    - 任意の非桁

  • *と一致 - 最長一致サフィックス
  • [^0-9]を削除このロジックを関数にラップします。

    extract_and_print() { 
        local input=$1 
        local name=${input%%=*} 
        local value=${input#*=} 
        value=${value%%[^0-9]*} 
        echo "$name=$value" 
    } 
    
    extract_and_print "$var1" 
    extract_and_print "$var2" 
    extract_and_print "$var3" 
    
  • +0

    私の文字列が ' ' string1の=「3423423と私は気にしない何か」になる場合は、この作品が、私の文字列が 'varが="文字列1 = 3423423と私はドン何か」ですt care "' 基本的に、=は文字列の中にあり、変数に何かを代入するための記号ではありません。 私の悪い、私は最初の投稿を編集する必要があります:) –

    +0

    私は質問に使用されていません、私はShiftキーを押しながらEnterだけでなく、新しい行のようです。私のコメントを再チェックしてください、私はそれを編集しました。 –

    +0

    本当に間違って申し訳ありません。これは私が2回目です。私は助けを求めています(通常私はそれを自分で作ることができます)。そして、これが3日目です。私はバッシュで働いているので、良い質問をするのは少し難しいです、cuz基本的に私は本当に何を尋ねるかわからない:) –

    1
    grep -oP '^.*?=\d+' inputfile 
    string one=3423423 
    another bigger string=413145 
    the longest string ever=23442 
    

    ここ-oフラグは一部のみと-pgrepperl正規表現を可能にするに一致する印刷するgrepを可能にします。ここでは\d+は1桁以上の数字を意味します。したがって、^.*?=\d+は、最後の数字(最初の一致)が見つかるまで、行の先頭から印刷することを意味します。

    +0

    あなたはおそらく完全にOPの要件を遵守するために(。? '^ * = \ D +')あなたのREの非貪欲フォームを使用する必要があります。 –

    +0

    @RenaudPacaletありがとう、............ –

    +0

    @PS。私は、オリジナルのポストでミスを犯している:基本的に私は、 'VAR =「文字列1 = 3423423と私は気にしない何か」' を を持っていると私は '文字列にその文字列をオンコマンドを、必要とします1 = 3423423' –

    0
    $ shopt -s extglob 
    
    $ echo "${var1%%+([^0-9])}" 
    string one=3423423 
    
    $ echo "${var2%%+([^0-9])}" 
    another bigger string=413145 
    
    $ echo "${var3%%+([^0-9])}" 
    the longest string ever=23442 
    

    +([^0-9])は、1つ以上の非数字と一致する拡張パターンです。
    ${var%%+([^0-9])}%%patternは、変数値の最後からパターンの最長一致を削除します。

    参考文献:patternsparameter substitution

    関連する問題