Comment puis-je insérer le contenu d'un fichier dans un autre fichier juste avant la ligne
Comment je peux insérer le contenu d'un fichier dans un autre fichier juste avant une ligne spécifique à l'aide de sed?
exemple, j'ai file1.xml qui sont les suivantes:
<field tagRef="376">
</field>
<field tagRef="377">
</field>
<field tagRef="58">
</field>
<group ref="StandardMessageTrailer" required="true"/>
</fieldList>
</message>
et file2.xml a la suite:
<field tagRef="9647">
<description>Offset</description>
</field>
<field tagRef="9648">
<description>Offset Units/Direction</description>
</field>
<field tagRef="9646">
<description>Anchor Price</description>
</field>
comment puis-je insérer le contenu de fichier2 dans fichier1 juste avant
<group ref="StandardMessageTrailer" required="true"/>
de sorte qu'il ressemble à ceci:
<field tagRef="376">
</field>
<field tagRef="377">
</field>
<field tagRef="58">
</field>
<field tagRef="9647">
<description>Offset</description>
</field>
<field tagRef="9648">
<description>Offset Units/Direction</description>
</field>
<field tagRef="9646">
<description>Anchor Price</description>
</field>
<group ref="StandardMessageTrailer" required="true"/>
</fieldList>
</message>
Je sais comment insérer après cette ligne à l'aide
sed 'group ref="StandardMessageTrailer"/r file2.xml' file1.xml > newfile.xml
mais je veux l'insérer avant.
apprécions l'aide
Je serais ravi de voir une réelle sed solution - je sais que cela doit être possible avec quelque chose comme
/StandardMessageTrailer/{x;r insert;G}
mais ce n'est pas tout à fait...OriginalL'auteur user301200 | 2010-03-25
Vous devez vous connecter pour publier un commentaire.
si vous voulez sed, voici une façon
sed
version n'a pas l'impression de la dernière ligne de fichier1. Si vous ajoutez-e '$G'
après la'x'
alors il va, mais il va échouer si la ligne avec la regex est la dernière ligne dans fichier1 par l'impression en ligne , le contenu de fichier2.merci. quant à la dernière ligne de la regex de la question. je parie sur il ne se passe pas, pour l'instant. 🙂 comme vous pouvez le voir, ma solution préférée est pas le sed.
Sur MacOS, vous pouvez écrire les modifications directement dans le fichier par l'ajout d'-je.bak à la commande:
sed -i.bak -e '/StandardMessageTrailer/r file2' -e 'x;$G' file1
OriginalL'auteur ghostdog74
Si vous pouvez supporter de faire deux passes, vous pouvez utiliser un marqueur:
La peine d'essayer de le faire en une seule passe est qu'il n'y a aucun moyen (que je connais) autres que les 'r' pour insérer le contenu d'un fichier, et " r " dans le flux de sortie, hors de la portée de la manipulation, de après sed est fini avec la ligne. Donc, si la "Norme" est dans la dernière ligne, tout ce que vous faites, il sera en charge par le temps fichier2 apparaît.
OriginalL'auteur Beta
Habituellement, je fais comme ceci:
extrait de script:
sed "\$r ${file2}" ${file1} > tmpfile
mv tmpfile ${file2}
OriginalL'auteur Tony
J'ai essayé les différentes solutions et de celui de la version Bêta a fait le travail pour moi.
Résumé :
Exemple :
Créer 2 fichiers :
cloud_config.yml:
etcd2.yml :
Puis nous exécutez le script :
Enfin, nous avons vu que :
OriginalL'auteur Thibault Deheurles
Ici, ce sont les solutions qui ont fonctionné pour moi:
À l'aide d'un marqueur comme expliqué dans une autre réponse:
De comptage de la ligne quand elle s'est produite comme expliqué dans une réponse à une question similaire:
Ou à l'aide de sed comme expliqué dans une réponse à une question similaire:
OriginalL'auteur Anthony O.