2009-05-20 7 views
4

Je suis relativement nouveau dans les scripts shell Unix. Voici mon problème. Je l'ai utilisé ce script ...Comment extraire une sous-chaîne correspondant à un motif à partir d'une variable de shell Unix

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

echo $test 

Pour générer ce résultat ...

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) 

Au lieu de faire écho à la sortie de isql, je voudrais extraire le « 257 » et le coller dans une autre variable, donc je peux retourner 257 du script. Je pense qu'une sorte de commande sed ou grep le fera, mais je ne sais pas vraiment par où commencer.

Des suggestions?

Répondre

14

bash peut dépouiller les parties du contenu des variables shell.

${parameter#pattern} renvoie la valeur du paramètre $ sans la partie au début qui correspond à pattern.

${parameter%pattern} renvoie la valeur du paramètre $ sans la partie à la fin qui correspond à pattern.

Je suppose qu'il existe une meilleure façon de faire cela, mais cela devrait fonctionner. Vous pouvez combiner cela en:

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

Si vous êtes intéressé par la partie (return status = xxx), ce serait:

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

La section pertinente de la page de manuel bash est « Paramètre Expansion ».

2

Voici un hack rapide et sale pour vous, mais vous devriez vraiment commencer à apprendre ce genre de choses vous-même:

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

Merci. C'est pourquoi je demande: je voulais voir des codeurs Unix expérimentés résoudre un problème du monde réel, afin que je puisse apprendre à le faire moi-même. Donc, dans ce cas, la commande tail redirige la dernière ligne de $ test vers la commande sed, qui retourne ce qui est dans \\ (et) \ (en supposant que le pattern global correspond). Est-ce correct? –

+0

Oui, tout ce qui est entre \\ (et \\) est alors donné par \ 1 dans la substitution. [0-9] \ + signifie correspondre à un ou plusieurs chiffres. –

Questions connexes