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'
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.