web-dev-qa-db-fra.com

Comment remplacer une ligne de fichier xml avec sed

J'ai le texte suivant dans File.XML:

<http-listener name="default" socket-binding="http" max-post-size="1073741824" />

Je voudrais remplacer cela par

<!-- <http-listener name="default" socket-binding="http" max-post-size="1073741824" /> -->>

J'ai essayé

sed -i 's/<http-listener name="default" socket-binding="http" max-post-size="1073741824" /><!-- <http-listener name="default" socket-binding="http" max-post-size="1073741824" /> -->>' test.xml

Mais j'ai eu une erreur

2
Picasu27

Insérez le bloc requis (<!--) au début (^):

sed 's/^/<!-- /'

Exemple:

% var='<http-listener name="default" socket-binding="http" max-post-size="1073741824" />'

% sed 's/^/<!-- /' <<<"$var"
<!-- <http-listener name="default" socket-binding="http" max-post-size="1073741824" />

Notez que pour analyser des données structurées telles que xml, vous devez utiliser un outil qui en comprend la structure, par exemple. xmlstarlet.


Réponse à la question modifiée:

Vous pouvez faire correspondre des sous-chaînes précises au début et à la fin. Lors du remplacement, utilisez \0 pour faire référence à la correspondance complète en mettant les sous-chaînes de remplacement souhaitées autour:

sed 's/^<http-listener name="default".*>$/<!-- \0 -->>/'

Exemple:

% var='<http-listener name="default" socket-binding="http" max-post-size="1073741824" />'

% sed 's/^<http-listener name="default".*>$/<!-- \0 -->>/' <<<"$var"                     
<!-- <http-listener name="default" socket-binding="http" max-post-size="1073741824" /> -->>
2
heemayl