To, co zrobiłeś, to usunąć SUBSTITUTETHISgdziekolwiek pojawi się w pliku (ale nie resztę wiersza, w którym się pojawia) i wstawić zawartość temp.TXTponiżej tego wiersza. Jeśli SUBSTITUTETHISpojawia się wiele razy w wierszu, usuwane jest tylko pierwsze wystąpienie i temp.TXTdodawana jest tylko jedna kopia .
Jeśli chcesz zastąpić cały wiersz, gdy się SUBSTITUTETHISpojawi, użyj dpolecenia. Ponieważ musisz biegać zarówno, jak ri dgdy jest mecz, umieść je w przygotowanej grupie.
sed -e '/SUBSTITUTETHIS/ {' -e 'r temp.TXT' -e 'd' -e '}' -i devel.txt
Niektóre implementacje sed pozwalają używać średników do oddzielania poleceń i całkowicie pomijają separatory wokół nawiasów klamrowych, ale nadal potrzebujesz nowej linii, aby zakończyć argument rpolecenia:
sed -e '/SUBSTITUTETHIS/ {r temp.TXT
d}' -i devel.txt
Jeśli chcesz zastąpić SUBSTITUTETHISzawartością pliku, ale zachować to, co jest przed i po nim w wierszu, jest to bardziej skomplikowane. Najprostszą metodą jest włączenie zawartości pliku do polecenia sed; pamiętaj, że będziesz musiał poprawnie zacytować jego zawartość.
sed -e "s/SUBSTITUTETHIS/$(<temp.TXT sed -e 's/[\&/]/\\&/g' -e 's/$/\\n/' | tr -d '\n')/g" -i devel.txt
Lub użyj Perla. Jest to krótkie, ale działa catraz dla każdej zmiany:
perl -pe 's/SUBSTITUTETHIS/`cat temp.TXT`/ge' -i devel.txt
Aby raz odczytać plik po uruchomieniu skryptu i unikać zależnie od polecenia powłoki:
perl -MFile::Slurp -pe 'BEGIN {$r = read_file("temp.TXT"); chomp($r)}
s/SUBSTITUTETHIS/$r/ge' -i devel.txt
(przedstawione w dwóch liniach dla czytelności, ale można pominąć podział linii). Jeśli nazwa pliku jest zmienna, aby uniknąć problemów z cytowaniem, przekaż ją do skryptu za pomocą zmiennej środowiskowej:
replacement_file=temp.TXT perl -MFile::Slurp -pe 'BEGIN {$r = read_file($replacement_file); chomp($r)}
s/SUBSTITUTETHIS/$r/ge' -i devel.txt