J'ai un fichier avec le contenu suivant:
<username><![CDATA[name]]></username>
<password><![CDATA[password]]></password>
<dbname><![CDATA[name]]></dbname>
et je dois créer un script qui modifie le "nom" de la première ligne en "quelque chose", le "mot de passe" de la deuxième ligne en "quelque chose de différent" et le "nom" de la troisième ligne en "quelque chose de différent". Je ne peux pas compter sur l'ordre de ces occurrences dans le fichier, je ne peux donc pas simplement remplacer la première occurrence de "name" par "quelque chose" et la seconde occurrence de "name" par "quelque chose de différent". En fait, je dois rechercher les chaînes environnantes pour trouver et remplacer la bonne chose.
Jusqu'à présent, j'ai essayé cette commande pour trouver et remplacer la première occurrence de "name":
sed -i "s/<username><![CDATA[name]]><\/username>/something/g" file.xml
mais cela ne fonctionne pas, alors je pense que certains de ces personnages pourraient avoir besoin de s'échapper, etc.
Idéalement, j'aimerais pouvoir utiliser regex uniquement pour faire correspondre les deux occurrences "nom d'utilisateur" et ne remplacer que le "nom". Quelque chose comme ça mais avec sed
:
<username>.+?(name).+?</username>
et remplacez le contenu entre parenthèses par "quelque chose".
Est-ce possible?
la source
Réponses:
C'est, je pense, ce que vous cherchez.
Explication:
\1
,\2
etc., dans la deuxième partie, des références au ième groupe capturé dans la première partie (la numérotation commence par 1)-E
active les expressions régulières étendues (nécessaires pour+
et grouper).la source
(original name) + "-E"
.\(
et à la\)
place de(
et)
.L'
/username/
avants
indique à sed de ne travailler que sur les lignes contenant la chaîne 'nom d'utilisateur'.la source
Si ce
sed
n’est pas une exigence absolue, utilisez plutôt un outil dédié.Si votre fichier est un fichier XML valide (pas seulement ces 3 balises ayant l'apparence de XML), vous pouvez utiliser XMLStarlet :
Ce qui précède fonctionnera également dans des situations difficiles à résoudre avec des expressions régulières:
Brève démonstration de ce qui précède:
la source
Vous devez citer
\[.*^$/
dans la partie expression régulière de las
commande et\&/
dans la partie de remplacement, ainsi que les nouvelles lignes. L'expression régulière est une expression régulière de base. De plus, vous devez citer le délimiteur de las
commande.Vous pouvez choisir un séparateur différent pour éviter de devoir citer
/
. Vous devrez citer ce caractère à la place, mais il est généralement important de changer le délimiteur pour en choisir un qui ne figure ni dans le texte à remplacer ni dans le texte de remplacement.Vous pouvez utiliser des groupes pour éviter de répéter certaines pièces dans le texte de remplacement et pour prendre en compte les variations de ces pièces.
la source
Vous pouvez simplement utiliser des adresses comme dans le numéro précédant "s" qui indique le numéro de ligne.
De plus, le nombre à la fin indique
sed
de remplacer la deuxième correspondance au lieu de remplacer la première.la source
Pour remplacer le mot "nom" par le mot "quelque chose", utilisez:
Cela va remplacer toutes les occurrences du mot spécifié.
Jusqu'ici tout est sorti en sortie standard, vous pouvez utiliser:
enregistrer les modifications dans un autre fichier.
la source
afin de remplacer la valeur dans un fichier de propriétés
la source