J'ai un fichier texte ( devel.xml
).
Je lui ai ajouté le mot REPLACETHIS afin de remplacer cette chaîne par le contenu d'un fichier différent ( temp.txt
).
La chose la plus proche que j'ai est la suivante:
sed -i -e "/REPLACETHIS/r temp.TXT" -e "s///" devel.txt;
Cela insère le contenu après la chaîne, puis supprime la chaîne par la suite.
Est-ce la meilleure façon de le faire?
text-processing
sed
perl
RafaelGP
la source
la source
Réponses:
Ce que vous avez fait est de supprimer l'
SUBSTITUTETHIS
endroit où il apparaît dans le fichier (mais pas le reste de la ligne où il apparaît) et d'insérer le contenutemp.TXT
sous cette ligne. SiSUBSTITUTETHIS
apparaît plusieurs fois sur une ligne, seule la première occurrence est supprimée et une seule copie detemp.TXT
est ajoutée.Si vous souhaitez remplacer la ligne entière lorsque
SUBSTITUTETHIS
s'affiche, utilisez lad
commande. Puisque vous devez exécuter les deuxr
etd
quand il y a un match, mettez-les dans un groupe contreventé.Certaines implémentations sed vous permettent d'utiliser des points-virgules pour séparer les commandes et d'omettre complètement les séparateurs autour des accolades, mais vous avez toujours besoin d'une nouvelle ligne pour terminer l'argument de la
r
commande:Si vous voulez remplacer
SUBSTITUTETHIS
par le contenu du fichier, mais conserver ce qui vient avant et après sur la ligne, c'est plus compliqué. La méthode la plus simple consiste à inclure le contenu du fichier dans la commande sed; notez que vous devrez citer correctement son contenu.Ou utilisez Perl. Ceci est court mais s'exécute
cat
une fois pour chaque substitution:Pour lire le fichier une fois au démarrage du script et éviter de dépendre d'une commande shell:
(présenté sur deux lignes pour plus de lisibilité mais vous pouvez omettre le saut de ligne). Si le nom de fichier est variable, pour éviter de citer des problèmes, transmettez-le au script via une variable d'environnement:
la source
cat temp.txt
je puisse fairecat ${variable}
?-0777
commutateur pour slurp dans tout le fichier, et un régulieropen
:perl -0777 -pe 'BEGIN {open F, q(temp.TXT); $r=<F>; chomp($r)} s/SUBSTITUTETHIS/$r/ge' -i devel.txt
r temp.TXT
avec des messages comme "BEGIN temp.TXT", "END temp.TXX"a
commande (ajouter). grymoire.com/Unix/Sed.html#uh-36