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 contenu temp.TXT
sous cette ligne. Si SUBSTITUTETHIS
apparaît plusieurs fois sur une ligne, seule la première occurrence est supprimée et une seule copie de temp.TXT
est ajoutée.
Si vous souhaitez remplacer la ligne entière lorsque SUBSTITUTETHIS
s'affiche, utilisez la d
commande. Puisque vous devez exécuter les deux r
et d
quand il y a un match, mettez-les dans un groupe contreventé.
sed -e '/SUBSTITUTETHIS/ {' -e 'r temp.TXT' -e 'd' -e '}' -i devel.txt
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:
sed -e '/SUBSTITUTETHIS/ {r temp.TXT
d}' -i devel.txt
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.
sed -e "s/SUBSTITUTETHIS/$(<temp.TXT sed -e 's/[\&/]/\\&/g' -e 's/$/\\n/' | tr -d '\n')/g" -i devel.txt
Ou utilisez Perl. Ceci est court mais s'exécute cat
une fois pour chaque substitution:
perl -pe 's/SUBSTITUTETHIS/`cat temp.TXT`/ge' -i devel.txt
Pour lire le fichier une fois au démarrage du script et éviter de dépendre d'une commande shell:
perl -MFile::Slurp -pe 'BEGIN {$r = read_file("temp.TXT"); chomp($r)}
s/SUBSTITUTETHIS/$r/ge' -i devel.txt
(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:
replacement_file=temp.TXT perl -MFile::Slurp -pe 'BEGIN {$r = read_file($replacement_file); chomp($r)}
s/SUBSTITUTETHIS/$r/ge' -i devel.txt