web-dev-qa-db-fra.com

utiliser Sed pour rechercher et remplacer du texte dans un fichier XML

J'ai le texte suivant dans File.XML:

<!--UpdateAccountGUIDs>UpdateAndExit</UpdateAccountGUIDs-->

Je voudrais remplacer cela par

<UpdateAccountGUIDs>UpdateAndExit</UpdateAccountGUIDs>

J'ai essayé:

$ sed -i 's/<!--UpdateAccountGUIDs>UpdateAndExit</UpdateAccountGUIDs-->/<UpdateAccountGUIDs>UpdateAndExit</UpdateAccountGUIDs>/' File.XML

Mais obtenez cette erreur:

sed: -e expression #1, char 63: unknown option to `s'
6
Shanker

Le problème est que votre modèle de recherche contient / que vous utilisez comme délimiteur de remplacement. Vous devez utiliser un autre caractère pour cela ou échapper le /:

sed -i 's#<!--UpdateAccountGUIDs>UpdateAndExit</UpdateAccountGUIDs-->#<UpdateAccountGUIDs>UpdateAndExit</UpdateAccountGUIDs>#' File.XML

ou

sed -i 's/<!--UpdateAccountGUIDs>UpdateAndExit<\/UpdateAccountGUIDs-->/<UpdateAccountGUIDs>UpdateAndExit<\/UpdateAccountGUIDs>/' File.XML

Notez que vous devriez ne jamais utiliser d'expressions régulières pour analyser [X] HTML .

Enfin, en règle générale, lorsque vous travaillez avec des expressions régulières, moins c'est plus. Vous devriez essayer de spécifier le modèle exclusif le plus simple possible plutôt que de répéter tout le texte. Cela rend non seulement votre code beaucoup plus facile à lire, mais vous évite également des problèmes similaires à celui que vous rencontriez. Par exemple:

sed -i -r 's/<!--(UpdateAccountGUIDs.+?)-->/<\1>/' File.XML

Ici, -r active la syntaxe étendue des expressions régulières afin que nous puissions utiliser () pour capturer un groupe (sans avoir besoin d'échapper aux parenthèses), puis faire référence au texte capturé sous la forme \1. Ainsi, la commande ci-dessus recherche simplement un commentaire adjacent à UpdateAccountGUIDs, qui s'étend jusqu'à la première fin de l'instruction de commentaire, puis effectue le remplacement.

11
terdon