To, co zrobiłeś, to usunąć SUBSTITUTETHIS
gdziekolwiek pojawi się w pliku (ale nie resztę wiersza, w którym się pojawia) i wstawić zawartość temp.TXT
poniżej tego wiersza. Jeśli SUBSTITUTETHIS
pojawia się wiele razy w wierszu, usuwane jest tylko pierwsze wystąpienie i temp.TXT
dodawana jest tylko jedna kopia .
Jeśli chcesz zastąpić cały wiersz, gdy się SUBSTITUTETHIS
pojawi, użyj d
polecenia. Ponieważ musisz biegać zarówno, jak r
i d
gdy 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 r
polecenia:
sed -e '/SUBSTITUTETHIS/ {r temp.TXT
d}' -i devel.txt
Jeśli chcesz zastąpić SUBSTITUTETHIS
zawartoś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 cat
raz 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