2011-05-20 8 views
2

quelqu'un peut-il m'aider?Sed rechercher et remplacer le chemin dans le fichier xml

Je suis en train d'écrire un script shell qui recherche un fichier XML pour un chemin:

<string>User/MyUser/Library/Folder/File.txt<string> 

remplace ensuite ce chemin avec un autre chemin:

<string>/Library/CustomFolder/CustomFile.txt<string> 

Le chemin que je cherche est variable mais contiendra toujours le mot Library.

Est-il possible de chercher >*/Library et le remplacer par >/Library

Je voudrais ensuite chercher Library*< et le remplacer par Library/CustomFolder/CustomFile.txt<

S'il vous plaît lire ci-dessus comme si le caractère * fait référence à tout chaîne ...

J'essaie actuellement d'y arriver en utilisant sed -i (parce que je veux modifier le fichier lui-même non seulement la sortie standard) mais je suis un peu un noob et je reçois une erreur en essayant de tester il.

Jusqu'à présent, j'ai:

sed -i 's/Library/TEST/g' ~/Library/Path/To/MyFile.xml 

Cela renvoie un des caractères supplémentaires à la fin d'une erreur de commande l, donc je ne l'ai pas eu à essayer de trouver le bit * encore ...

Y a-t-il une meilleure façon de le faire ou est-ce que je me trompe?

Merci d'avance!

Mattus

+0

pourriez-vous poster votre message d'erreur exact? Quel OS et shell utilisez-vous (par exemple Linux et bash ou Windows et Cygwin) – OpenSauce

Répondre

1

est méconnaissant cette pas la meilleure façon de modifier un fichier XML à l'aide d'un éditeur basé sur la ligne (comme sed est), vous pouvez par exemple faire:

sed -i.bak 's/>[^>]*Library/>Library/;s#Library[^<]*<#Library/CustomFolder/CustomFile.txt<#' ~/Library/Path/To/MyFile.xml 

sed -i.bak fera un enplace de modifier myfile.xml enregistrement d'une sauvegarde du fichier original dans MyFile.xml.bak.
I utilisé deux commandes s une (s/>[^>]*Library/>Library/) remplaçant > suivie d'un nombre quelconque de caractères autres que > y compris une chaîne Library suivante avec >Library.
L'autre (s#Library[^<]*<#Library/CustomFolder/CustomFile.txt<# remplace la chaîne Library suivi d'un nombre de caractères! = < suivi d'un < avec Library/CustomFolder/CustomFile.txt<. S'il vous plaît remarque que je # au lieu du / d'habitude pour éviter la nécessité d'échapper aux / personnages du remplacement

+0

hmm je reçois toujours ce – Mattus

+0

caractères supplémentaires à la fin de la commande – Mattus

+0

Une idée de ce qui cause? J'essaie de tester à travers le terminal sur le léopard des neiges ... – Mattus

2

Cela peut devenir un peu difficile et compliqué lorsque vous essayez de modifier votre fichier xml avec seulement des utilitaires sed/awk.Si vous avez besoin de faire quelques modifications xml plus complexes cette solution peut vous aider:

Si vous pouvez installer un logiciel sur votre machine, vous pouvez essayer:

xmlstarlet: http://xmlstar.sourceforge.net/

Après l'installation vous pouvez la modifier votre fichier comme ceci:

$>./xmlstarlet ed -u '/xml/table/rec[@id=1]/numField' -v 42 xml/myfile.xml

Bien sûr, cet outil vous permet d'effectuer des tâches plus complexes qu'un simple modifier un si ngle valeur d'un élément xml. Ce qui peut devenir très utile un jour.

Une liste de commandes complètes/fonctionnalités peuvent être trouvés ici:

http://xmlstar.sourceforge.net/doc/xmlstarlet.txt

0

Je propose:

sed -i '' 's/Library/TEST/g' ~/Library/Path/To/MyFile.xml 

Je pense que l'option -i engloutit commande 's de votre façon de penser son l'extension de secours

(juste eu et fixé le même problème)

Questions connexes