Odpowiedzi:
lead='^### BEGIN GENERATED CONTENT$'
tail='^### END GENERATED CONTENT$'
sed -e "/$lead/,/$tail/{ /$lead/{p; r insert_file
}; /$tail/p; d }" existing_file
r insert_file
Polecenie musi być ostatnią rzeczą, na swojej linii. Zauważ, że ani białe znaki, ani komentarze nie są dozwolone po nim. Kod został przetestowany przy użyciu GNU sed
z --posix
włączoną opcją i działał zgodnie z oczekiwaniami, więc powinien działać z dowolną zgodną z POSIX-emsed
.
output=$(sed -e "..." existing_file)
), A następnie wykonania zamiany w drugim przejściu (np. echo "$output" > existing_file
), Ponieważ próba przekierowania do pliku, z którego czytasz, spowoduje obcięcie go przed odczytaniem zawartości.
Ostrzeżenie: To zdecydowanie nie jest najprostszy sposób, aby to zrobić. (EDYCJA: bash działa; POSIX grep też jest w porządku)
Jeśli główny tekst znajduje się w pliku „main”, a wygenerowana treść znajduje się w pliku „gen”, możesz wykonać następujące czynności:
#!/bin/bash
BEGIN_GEN=$(cat main | grep -n '### BEGIN GENERATED CONTENT' | sed 's/\(.*\):.*/\1/g')
END_GEN=$(cat main | grep -n '### END GENERATED CONTENT' | sed 's/\(.*\):.*/\1/g')
cat <(head -n $(expr $BEGIN_GEN - 1) main) gen <(tail -n +$(expr $END_GEN + 1) main) >temp
mv temp main
main
do pisania, wyczyszczenia, zanim zostanie przeczytana przez kota.
ed -s FILE1 <<EOF
/### BEGIN GENERATED/+,/### END GENERATED/-d
/### BEGIN GENERATED/ r FILE2
w
q
EOF
r FILE2
możesz powiedzieć, r !command
że czytasz z innego skryptu.
sed
może zrobić o wiele więcej niż tylkos/.../...
!