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