2

テキストを含む変数があります。stdoutにエコーできるので、変数は問題ないと思います。私の問題は、そのテキスト変数のパターンをgrepしようとしていることです。これが私が試していることです:

ERR_COUNT=`echo $VAR_WITH_TEXT | grep "ERROR total: (\d+)"`

$ ERR_COUNTをエコーすると、変数が空のように見えるので、何か間違ったことをしているに違いありません。

これを正しく行う方法は?ありがとう。

編集-私が変数に持っているサンプルテキストでそのパターンをテストすることは私に何かを与えることを言及したかっただけです(私はhttp://rubular.comでテストしました)

ただし、正規表現はまだ間違っている可能性があります。

EDIT2-まだ結果が得られていないので、これが私が扱っている文字列です:

ALERT line125: Alert: Cannot locate any description for 'asdf' in the qwer.xml hierarchy. (due to (?i-xsm:\balert?\b) ALERT in ../hgfd.controls) ALERT line126: Alert: Cannot locate any description for 'zxcv' in the qwer.xml hierarchy. (due to (?i-xsm:\balert?\b) ALERT in ../dfhg.controls) ALERT line127: Alert: Cannot locate any description for 'rtyu' in the qwer.xml hierarchy. (due to (?i-xsm:\balert?\b) ALERT in ../kjgh.controls) [1] 22280 IGNORE total: 0 WARN total: 0 ALERT total: 3 ERROR total: 23 [1] + Done /tool/pandora/bin/gvim -u NONE -U NONE -nRN -c runtime! plugin/**/*.vim -bg ...

これは文字列なので、あいまいさがなくなることを願っています...数値「23」(「ERRORtotal:」の後)を変数に抽出したいのですが、苦労しています。

乾杯

4

4 に答える 4

6

bashの=~演算子を使用して値を抽出できます。

[[ $VAR_WITH_TEXT =~ ERROR\ total:\ ([0-9]+) ]]

スペースをエスケープするか、正規表現の固定部分のみを引用する必要があることに注意してください。

[[ $VAR_WITH_TEXT =~ "ERROR total: "([0-9]+) ]]

メタ文字のいずれかを引用すると、文字通りに扱われるためです。

正規表現を変数に保存することもできます。

regex="ERROR total: ([0-9]+)"
[[ $VAR_WITH_TEXT =~ $regex ]]

いずれの場合も、式が一致すると、括弧で囲まれた式がBASH_REMATCH配列内に表示されます。

ERR_COUNT=${BASH_REMATCH[1]}

(0番目の要素には、一致する正規表現全体が含まれます。括弧で囲まれた部分式は、完全な正規表現に表示される順序で残りの要素にあります。)


を使用する場合grepは、Perlスタイルの正規表現を受け入れることができるバージョンが必要です。

ERR_COUNT=$( echo "$VAR_WITH_TEXT" | grep -Po "(?<=ERROR total: )\d+" )

後読みアサーションを有効にするためにPerlスタイルの正規表現を使用する必要がある限り、。に置き換えることができ[0-9]ます\d

于 2012-08-07T02:49:11.473 に答える
3

エラーは次のパターンにあります:(\d+)一致:

  • '('
  • 数字
  • '+'
  • ')'

あなたのコメントによると、あなたが欲しいのは\(\d\+\)、それです:

  • によってサブパターンを定義します\( ... \)
    • 内部では、少なくとも1つの(\+)桁(\d)と一致します。

この場合、サブパターンが必要ない場合は、\(とを削除するだけ\)です。

注:grepがわからない場合\dは、に置き換えることができます[0-9]。最も簡単な方法はgrep '\d'、いくつかのテスト行を記述して、それを記述してテストすることです。

于 2012-08-06T22:30:57.523 に答える
2
# setting example data
    test="adfa\nfasetrfaqwe\ndsfa ERROR total: 32514235dsfaewrf"

1つの解決策:

echo $(sed -n 's/^.*ERROR total: \([0-9]*\).*$/\1/p' < <(echo $test))
32514235

他の解決策:

# throw away everything up to "ERROR total: "
test=${test##*ERROR total: } 
# cut from behind assuming number contains no spaces and is
# separated by space
test=${test%% *}
echo $test
32514235
于 2012-08-06T22:27:13.647 に答える
1

おそらく、\dperl正規表現モードでは数字としてのみ認識されます。おそらく、を使用する必要がありますgrep -P

番号だけが必要な場合は、次のことを試すことができます。

ERR_COUNT=$(echo $VAR_WITH_TEXT | perl -pe "s/.*ERROR total: (\d+).*/\1/g")

また:

ERR_COUNT=$(echo $VAR_WITH_TEXT | sed -n "s/.*ERROR total: ([0-9]+).*/\1/gp")

于 2012-08-06T22:30:02.577 に答える