Antworten:
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
Befehl muss das Letzte in seiner Zeile sein. Beachten Sie, dass danach weder Leerzeichen noch Kommentare zulässig sind. Der Code wurde unter Verwendung von GNU sed
mit --posix
aktivierter Option getestet und funktionierte wie erwartet, daher sollte er mit allen posix-kompatiblen funktionieren sed
.
output=$(sed -e "..." existing_file)
) erfassen und dann in einem zweiten Durchgang (z. B. echo "$output" > existing_file
) ersetzen müssen, da die Umleitung in eine Datei, aus der Sie lesen, dazu führt, dass sie abgeschnitten wird, bevor der Inhalt gelesen wird.
Warnung: Dies ist definitiv nicht der einfachste Weg, dies zu tun. (EDIT: bash funktioniert; POSIX grep ist auch in Ordnung)
Wenn sich der Haupttext in der Datei "main" befindet und sich der generierte Inhalt in der Datei "gen" befindet, können Sie Folgendes tun:
#!/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
zum Schreiben geöffnet und gelöscht, bevor sie von cat gelesen wird.
ed -s FILE1 <<EOF
/### BEGIN GENERATED/+,/### END GENERATED/-d
/### BEGIN GENERATED/ r FILE2
w
q
EOF
r FILE2
Sie können sagen r !command
, aus einem anderen Skript zu lesen.
sed
kann so viel mehr als nurs/.../...
!