J'ai un certain nombre de fichiers que je souhaite mettre à jour en remplaçant une chaîne multi-lignes par une autre chaîne multi-lignes. Quelque chose dans le sens de:
* Some text,
* something else
* another thing
Et je veux le remplacer par:
* This is completely
* different text
Le résultat serait qu'après le remplacement, le fichier contenant le premier bloc de texte contiendra désormais la deuxième chaîne (le reste du fichier est inchangé).
Une partie du problème est que je dois trouver la liste des fichiers à mettre à jour dans le système de fichiers. Je suppose que je peux utiliser grep pour cela (bien que ce ne soit pas aussi facile à faire avec des chaînes multilignes) que le canaliser dans sed peut-être?
Y a-t-il un moyen facile de faire ceci? Sed est une option mais c'est gênant car je dois ajouter \ n etc. Existe-t-il un moyen de dire "prenez l'entrée de ce fichier, faites-la correspondre dans ces fichiers, puis remplacez-la par le contenu de cet autre fichier"? Je peux utiliser python si besoin est, mais je veux quelque chose de simple et rapide, donc s'il y a un utilitaire disponible, je préfère l'utiliser plutôt que d'écrire mon propre script (que je sais faire).
some text, something else another thing
s'il s'étend sur plusieurs lignes ou non? Ou vous voulez seulement correspondresome text,\nsomething else\nanotherthing
?Réponses:
Remplacer "Some ... \ n ... Thing" par le contenu du fichier "new" dans un ou plusieurs fichiers d'entrée
-i
changer directement input.txt-p0
slurp fichier d'entrée et l'imprimer à la fins/regexp/.../s
dans regexp.
est.|\n
s/.../exp/e
remplacer pareval(exp)
s/Some text\n...\n...thing\n/...
la source
perl -i -p0e ' $b= `cat before`; s/$b/Some thing\n/se' input.txt ...
Je crains que vous ayez du mal à trouver une solution qui vous convienne jusqu'à ce que vous élaboriez une description concrète du problème - mais c'est à cela que l'AQ est le mieux adapté, à mon avis. Peut-être que cela vous donnera une idée - il gardera toujours 3 lignes dans l'espace de motif à la fois - avec un lookahead de 2 lignes - tout en glissant vers l'avant dans le fichier d'entrée uniquement une ligne à la fois.
Il devrait être en mesure de faire correspondre votre chaîne, qu'elle s'étende sur plusieurs lignes ou non - jusqu'à trois, c'est-à-dire. Mais il n'y a aucune disposition pour refléter cette disposition dans le remplacement - elle s'étend toujours sur deux lignes telles qu'elles sont écrites.
la source
Pas trop fort (car ne pas chech deuxième chaîne mais c'est facile à régler) et peut être n'est pas compilant posix mais très simple:
La première commande ajoute des lignes à partir du texte jusqu'à ce qu'elles rencontrent autre chose, puis la deuxième ligne le change en un autre texte.
REMARQUE La limitation est que certains textes doivent toujours être suivis d' une autre chose .
la source