0
votes

Je veux remplacer un chemin d'accès dans un fichier YML avec un autre chemin dans ce fichier

J'ai essayé de remplacer un chemin d'accès à l'intérieur d'un fichier YML à l'aide de commandes SED et a également essayé de commenter l'ancien chemin dans ce fichier. Le commentaire fonctionne bien mais pas spécifiquement pour ce chemin. Il y a aussi d'autres chemins dans ce fichier aussi. mon fichier YML ressemble à: xxx

maintenant je veux que mon fichier ressemble à xxx

Veuillez noter que le fichier YML a quatre espaces et puis un "-" avant le chemin xxx

mais cela ne semble pas fonctionner, une autre chose qui a été essayée est xxx

Cela fonctionne bien, mais il ajoute un commentaire sur chaque chemin qui commence par / home et fait également écho au chemin à la fin du fichier. Par conséquent, je dois utiliser quelque chose avec SED car je veux remplacer le chemin avec la date actuelle.

S'il vous plaît laissez-moi savoir si je voudrais remplacer la date du dossier avec la date d'hier, car je souhaite exécuter le script Après un jour de la création de dossier.


2 commentaires

Les outils YAML doivent être analysés avec un analyseur de syntaxe, comme YQ . Pouvez-vous installer un tel outil? - Mikefarah.gitbook.io/yq


Je n'ai pas essayé d'installer que j'essayais de le remplacer directement à l'aide de SED sans analyser


3 Réponses :


-1
votes

Il y a quelques problèmes que je vois:

Qu'est-ce que la regex supposait faire en premier lieu? h3>

L'expression régulière / home / s / ^ # * / # / effectuera un remplacement sur toutes les lignes contenant home code> (cool), mais il remplacera tout nombre de # code> au début de la ligne avec un seul # code>. p>

c'est: il supprimera tout # code> au début de chaque ligne, puis ajoutez un nouveau à chaque ligne (comme ^ # * code> correspondra à zéro hachage de tête aussi). p>

Ceci est probablement pas em> ce que vous voulez. p>

Sing-Cutations empêchera la expansion des variables h3>

sed -e '/ $ spth / s / s / ^ # * / # / # / code> effectuera la substitution sur toutes les lignes contenant le littéral $ sp Code> (Indépendamment de la variable de coquille SPTH CODE> et de ce que c'est le contenu du contenu). p>

Ceci est probablement pas em> ce que vous voulez.

si vous voulez $ SPTH code> pour être développé, vous avez besoin de guillemets ( " code>)

(mais bien sûr, vous rencontrez des problèmes car la valeur étendue de $ spth code> contient des barres obliques, interférant avec l'expression sed elle-même). p> solution . h1>

Pour simplement remplacer le répertoire actuel, utilisez quelque chose comme: p> xxx pré>

ceci utilise le tuyau | code> comme caractère de délimitation , pour éviter les problèmes avec la barre oblique dans $ {SPTH} code>. Il capture l'indentation, le tiret et le début du fichier (jusqu'à la fin de $ {SPTH} code>) dans le groupe de capture \ 1 code>, qui est ensuite utilisé dans le Remplacement, le texte de remplacement a donc la même empreinte que l'original (espérons-le en garder votre YAML intact) p>

si vous souhaitez conserver le chemin d'origine et le commenter, utilisez P>

sed \
  -e "s|^\(\( *-  *${SPTH}\)/.*/\*_\*_\*\)$|#\1\n\2/$(date +%Y%m%d)/*_*_*|" \
  -i test.yml


1 commentaires

Vous pouvez utiliser & dans le remplacement au lieu d'un groupe de capture supplémentaire pour toute la ligne.



0
votes

L'utilisation d'outils de traitement de texte simples pour YAML ne fonctionnera pas toujours correctement. Une telle solution peut être acceptable si vous savez que votre entrée YAML aura toujours un certain format.

supposant que vous souhaitez remplacer toutes les occurrences forte> de p> xxx pré>

avec p> xxx pré>

Vous pouvez utiliser p> xxx pré>

avec votre exemple entrée Ceci imprime p>

date -d yesterday +%Y%m%d


0 commentaires

0
votes

Vous pouvez essayer: xxx

sortie: xxx

Utilisez SED avec option -i pour enregistrer la sortie < / p>


2 commentaires

Merci pour cela. Je suis presque là-bas. Pouvez-vous s'il vous plaît dites-moi si je veux changer la date à hier dans le même script, comment est-ce possible? Comme je vais exécuter le script après un jour de création de ce dossier de date


Je l'ai atteint par moi-même merci. J'ai fait date -d "hier" +% y% m% d hier = $ (date -d "hier" +% y% m% d)