Quello che hai fatto è rimuovere SUBSTITUTETHIS
ovunque appare nel file (ma non il resto della riga in cui appare) e inserire il contenuto temp.TXT
sotto quella riga. Se SUBSTITUTETHIS
appare più volte su una riga, viene rimossa solo la prima occorrenza e temp.TXT
viene aggiunta una sola copia di .
Se si desidera sostituire l'intera riga quando SUBSTITUTETHIS
appare, utilizzare il d
comando. Dal momento che è necessario eseguire entrambi r
e d
quando c'è una partita, metterli in un gruppo rinforzato.
sed -e '/SUBSTITUTETHIS/ {' -e 'r temp.TXT' -e 'd' -e '}' -i devel.txt
Alcune implementazioni sed consentono di utilizzare i punti e virgola per separare i comandi e omettere del tutto i separatori attorno alle parentesi graffe, ma è comunque necessaria una nuova riga per terminare l'argomento con il r
comando:
sed -e '/SUBSTITUTETHIS/ {r temp.TXT
d}' -i devel.txt
Se si desidera sostituire SUBSTITUTETHIS
con il contenuto del file, ma conservare ciò che viene prima e dopo sulla linea, è più complicato. Il metodo più semplice è includere il contenuto del file nel comando sed; nota che dovrai citare correttamente il suo contenuto.
sed -e "s/SUBSTITUTETHIS/$(<temp.TXT sed -e 's/[\&/]/\\&/g' -e 's/$/\\n/' | tr -d '\n')/g" -i devel.txt
Oppure usa Perl. Questo è breve ma viene eseguito cat
una volta per ogni sostituzione:
perl -pe 's/SUBSTITUTETHIS/`cat temp.TXT`/ge' -i devel.txt
Per leggere il file una volta all'avvio dello script ed evitare a seconda di un comando shell:
perl -MFile::Slurp -pe 'BEGIN {$r = read_file("temp.TXT"); chomp($r)}
s/SUBSTITUTETHIS/$r/ge' -i devel.txt
(presentato su due righe per leggibilità ma è possibile omettere l'interruzione di riga). Se il nome del file è variabile, per evitare problemi di quotazione, passalo allo script tramite una variabile di ambiente:
replacement_file=temp.TXT perl -MFile::Slurp -pe 'BEGIN {$r = read_file($replacement_file); chomp($r)}
s/SUBSTITUTETHIS/$r/ge' -i devel.txt