Ce que vous avez fait est de supprimer l' SUBSTITUTETHISendroit 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.TXTsous cette ligne. Si SUBSTITUTETHISapparaît plusieurs fois sur une ligne, seule la première occurrence est supprimée et une seule copie de temp.TXTest ajoutée.
Si vous souhaitez remplacer la ligne entière lorsque SUBSTITUTETHISs'affiche, utilisez la dcommande. Puisque vous devez exécuter les deux ret dquand 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 rcommande:
sed -e '/SUBSTITUTETHIS/ {r temp.TXT
d}' -i devel.txt
Si vous voulez remplacer SUBSTITUTETHISpar 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 catune 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