2009-05-20 2 views
4

私は比較的Unixシェルスクリプトの新機能です。ここに私の問題がある。私は Unixシェル変数からパターンにマッチする部分文字列を取り出す方法

Msg 257, Level 16, State 1: 
Server 'MY_SERVER', Procedure 'MY_STORED_PROC': 
Implicit conversion from datatype 'VARCHAR' to 'NUMERIC' is not allowed. Use 
the CONVERT function to run this query. 
(1 row affected) 
(return status = 257) 

代わりisqlの出力をエコーで、私は「257」を抽出し、それを固執したいと思います...
isql -S$server -D$database -U$userID -P$password <<EOF> $test 
exec MY_STORED_PROC 
go 
EOF 

echo $test 

は、この結果を生成するには...このスクリプトを使用しました私はスクリプトから257を返すことができるように別の変数。私は何らかのsedやgrepコマンドがこれをやると思っていますが、どこから始めたらいいかわかりません。

提案がありますか?

 
RC=`tail -1 $test |sed 's/(return status = \([0-9]\+\))/\1/'` 

答えて

14

bashがシェル変数の内容から部品を取り除くことができます:あなたは本当にこのようなものを自分で学習を開始すべきであるにもかかわらず

2

はここで、あなたのための迅速かつ汚いハックです。

${parameter#pattern}は、最初にpatternに一致する部分を除いた$ parameterの値を返します。

${parameter%pattern}は、末尾にpatternと一致する部分を除いた$ parameterの値を返します。

私はこれを行うより良い方法があると思いますが、これはうまくいくはずです。 だから、あなたにこれを組み合わせることができます:あなたは(return status = xxx)部分に興味があるなら

% strip the part before the value: 
test=${test#Msg } 
% strip the part after the value: 
test=${test%, Level*} 
echo $test 

、それは次のようになります。

result=${test#*(result status = } 
result=${result%)*} 
echo $result 

、bashのmanページの関連セクションは、「パラメータ展開」です。

+0

ありがとうございました。だから私は尋ねる理由は:私は、経験豊かなUnixのコーダーが実世界の問題を解決するのを見たかったので、私はそれを自分でやることを学ぶことができました。この場合、tailコマンドは$ testの最後の行をsedコマンドに渡します。これは\\(と)\(全体のパターンが一致していると仮定して)の中にあるものを返します。そうですか? –

+0

はい、\\(と\\)の間にあるものは、置換で\ 1で与えられます。 [0-9] \ +は、1つ以上の数字と一致することを意味します。 –

関連する問題