2010-08-27 12 views
2

J'ai sauvé une valeur par commande shell: Par exemple:Shell: Comment remplacer quelque chose d'un texte avec la valeur variable enregistrée

timeoutvalue=`echo "timeout=2.0"` 

Et je dois grep la valeur du délai d'attente d'un autre texte, et remplacez-le par cette valeur timeout. Par exemple, le texte est egtest:

<host ip="255.255.255.0" name="testhost" description="hostfortest" connection="xmlrpc" timeout=4.0/> 

Je veux grep la valeur du délai d'attente du texte ci-dessus et remplacer la valeur de timeout=4.0 par timeout=2.0 (la valeur I enregistrée en tant que variables par commande shell).

Mon problème est: (1) pour un test simple, je veux remplacer la valeur de timeout = 4.0 par $ timeoutvalue. Donc, ma commande est:

sed 's/timeout=4.0/$timeoutvalue/g' egtext.

Mais il semble que le texte devient:

<host ip="255.255.255.0" name="testhost" description="hostfortest" connection="xmlrpc" $timeoutvalue/> 

Quelqu'un pourrait me dire pourquoi il est faux?

(2) Pour ce problème, je dois d'abord grep timeout=4.0 du texte, et remplacer la valeur 4.0 par la valeur de la variable enregistrée (dans mon exemple: 2.0). Je pensais mais je ne sais pas quelle commande utiliser pour réaliser ceci (awk? Sed?) Parce que le dépôt du texte n'est pas certain, (par exemple, dans ce texte, le délai d'expiration est $5, mais peut-être dans un autre texte, il peut être changé en $6). Je veux dire, il peut être changé en:

<host ip="255.255.255.0" name="testhost" description="hostfortest" connection="xmlrpc" type="onebox" timeout=4.0/> 

Quelqu'un pourrait-il m'aider avec ceci?

Répondre

2

Apostrophe ne permet pas l'interpolation de variables, donc utilisez des guillemets doubles comme:

sed "s/timeout=4.0/$timeoutvalue/g" egtext 

EDIT:

Tenir compte

who='world' 
echo "Hello $who" # prints Hello world 
echo 'Hello $who" # prints Hello $who 

vu des guillemets simples n'a pas permettre la substitution de variables. Il traite littéralement $who comme un dollar suivi de who. Mais le double guillemet se comporte différemment, quand il voit $who il se rend compte que who est une variable et remplace $who avec sa valeur.

+0

, merci beaucoup pour votre réponse. Il semble que je n'ai pas encore pleinement reconnu la différence entre devis simple et devis double. Merci. – zhaojing

1

Les guillemets simples inhibent l'expansion des variables.

sed 's/timeout=4.0/'"$timeoutvalue"'/g' egtext 
+0

lgnacio, merci pour votre méthode et réponse rapide. Mais pourriez-vous me dire comment nous utilisons d'autres guillemets simples en plus des guillemets de $ timeoutvalue? Merci. Codaddict – zhaojing

1

Je voudrais écrire votre code comme suit.

timeoutvalue='timeout=2.0' 
sed "s/timeout=[.0-9]*/${timeoutvalue}/" egtext 
+0

z1x2, merci beaucoup pour votre belle réponse. En fait, c'est juste ce que je veux. – zhaojing