sed supprime une partie de toutes les occurrences de match

J’ai un fichier “names.xml” qui ressemble à ce qui suit:

NAME="James" NAME="Jack_DONE" NAME="John_DONE" NAME="Jimmy" 

Je veux utiliser une seule commande de ligne SED pour trouver toutes les occurrences de ‘NAME = “J” qui a’ _DONE ‘dans le “” et je veux supprimer uniquement le’ _DONE ‘de toutes les correspondances trouvées.

Donc, le résultat devrait ressembler à:

  NAME="James" NAME="Jack" NAME="John" NAME="Jimmy" 

C’est la commande que j’utilise:

 sed 's/^[^#]\(.*\)NAME="J\(.*\)_DONE"/\1"NAME=J\2"/' names.xml 

Je suis sûr que je peux le faire d’une manière beaucoup plus efficace! Votre temps et votre aide sont très appréciés.

Avec GNU sed: Uniquement dans les lignes contenant NAME="J recherche _DONE et remplace par rien.

 sed '/NAME="J/{s/_DONE//}' names.xml 

Sortie:

     NOM = "James"
     NAME = "Jack"
     NOM = "John"
     NOM = "Jimmy"

Vous pouvez utiliser:

 sed -i.bak -r '/^#/!s/(NAME="J[^"]*)_DONE"/\1"/' file NAME="James" NAME="Jack" NAME="John" NAME="Jimmy" 

Seule une modification mineure est nécessaire pour corriger la position des guillemets et de l’indentation:

 sed 's/^\([^#].*\)NAME="J\(.*\)_DONE"/\1NAME="J\2"/' names.xml 

Voici une version awk :

 awk '/NAME="J/ {sub(/_DONE/,"")}1' names.xml NAME="James" NAME="Jack" NAME="John" NAME="Jimmy" 

Pour le réécrire dans le fichier:

 awk '/NAME="J/ {sub(/_DONE/,"")}1' names.xml > tmp && mv tmp names.xml 

ou si vous avez gnu awk >= 4.1

 awk -i '/NAME="J/ {sub(/_DONE/,"")}1' names.xml