Как извлечь подстроку, соответствующую шаблону, из переменной оболочки Unix - PullRequest
4 голосов
/ 20 мая 2009

Я относительно новичок в сценариях оболочки Unix. Вот моя проблема. Я использовал этот скрипт ...

isql -S$server -D$database -U$userID -P$password << EOF > $test
exec MY_STORED_PROC
go
EOF

echo $test

Для генерации этого результата ...

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» и вставить его в другую переменную, чтобы я мог вернуть 257 из сценария. Я думаю, что какая-то команда sed или grep сделает это, но я не знаю, с чего начать.

Есть предложения?

Ответы [ 2 ]

13 голосов
/ 20 мая 2009

bash может удалять части из содержимого переменных оболочки.

${parameter#pattern} возвращает значение параметра $ без детали в начале, которая соответствует pattern.

${parameter%pattern} возвращает значение параметра $ без детали в конце, которая соответствует pattern.

Я думаю, есть лучший способ сделать это, но это должно сработать. Таким образом, вы можете объединить это в:

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

Если вы заинтересованы в (return status = xxx) части, это будет:

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

Соответствующий раздел справочной страницы bash - «Расширение параметров».

2 голосов
/ 20 мая 2009

Вот быстрый и грязный хак для вас, хотя вы действительно должны начать изучать этот материал самостоятельно:

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