2010-08-27 13 views
2

Je dois extraire un paramètre d'un fichier de configuration et remplacer ses valeurs par une autre valeur donnée. Le fichier de configuration est la suivante:Regex: Aide pour extraire un fichier du texte et remplacer la valeur du champ

<host ip="200.200.200.200" name="testhost" description="test server" type="TEST_Duplex " connection="xmlrpc" xmldefaulttimeout="2.0" xmlspecifictimeout ="8.0"/> 

je dois remplacer la valeur de xmldefaulttimeout="2.0" avec une autre valeur, par exemple: xmldefaulttimeout="4.0". Comme dans le texte, xmldefaulttimeout = "2.0", mais en fait, la valeur "2.0" n'est pas certaine. Ce peut être une autre valeur incertaine. Donc je dois grep la valeur de xmldefaulttimeout et la remplacer par une autre valeur donnée (par exemple: 4.0). Je pense que je dois utiliser sed ou awk. Mais je suis désolé mes commandes essayées ne peuvent pas réaliser ceci. Quelqu'un pourrait-il m'aider avec ça? Merci! Je suis désolé, je commence juste à apprendre shell :-)

+1

est-il en utilisant des expressions régulières avec un shell ** doit **? Avez-vous accès à un langage de script avec des outils XML, disons Perl/Python/Ruby? N'importe lequel d'entre eux peut rendre votre travail beaucoup plus facile. Juste une pensée. –

+0

Manoj, merci. Je pense que l'utilisation d'expressions régulières avec shell est un must. Merci pour vos suggestions. Je vais les étudier ensuite. – zhaojing

+1

Pourquoi cette question? Vous avez posté une question assez similaire il y a 2 heures (http://stackoverflow.com/questions/3581169/shell-how-to-replace-something-of-a-text-with-the-saved-variable-value) – maxschlepzig

Répondre

1
input='<host ip="200.200.200.200" name="testhost" description="test server" type="TEST_Duplex " connection="xmlrpc" xmldefaulttimeout="2.0" xmlspecifictimeout ="8.0"/' 

new_value='xmldefaulttimeout="4.0"' 

echo $input | sed "s/xmldefaulttimeout=\"[0-9.]*\"/$new_value/" 

Pour correspondre à une valeur de xmldefaulttimeout vous devrez utiliser une expression régulière: xmldefaulttimeout=\"[0-9.]*\"

  • xmldefaulttimeout=: Assorti littéralement
  • \": Pour correspondre à un littéral ", vous devez pour échapper à " pour empêcher la fin prématurée du modèle.
  • [0-9.]: classe Char pour correspondre aux chiffre ou une période
  • *: zéro ou plusieurs des caractère précédent.
+0

codaddict, merci encore pour vos informations détaillées. En effet, je n'ai pas encore utilisé l'expression regex pour réaliser ceci. Je viens de commencer à apprendre shell. Un grand merci pour vos informations détaillées à la fois pour cette question et la dernière question! – zhaojing

1

bash 3.2+

#!/bin/bash 

new='xmldefaulttimeout="4.0"' 
exec 4<"file" 
while read -r line <&4 
do 
    case "$line" in 
    *"xmldefaulttimeout="*) 
    [[ $line =~ "(.*)(xmldefaulttimeout=\".[^ \t]*\")(.*)" ]] 
    echo ${BASH_REMATCH[1]}${new}${BASH_REMATCH[3]} 
     ;; 
    esac 
done 
exec 4<&- 
+0

ghostdog74, merci encore pour votre réponse sympathique et serviable! Et ça marche :-) Votre script m'aide à apprendre beaucoup plus. Je viens de commencer à apprendre shell, merci pour votre aide! – zhaojing