Angenommen, ich hatte einen Textblock in ~/.bashrc
:
#~/.bashrc
# ...some commands...
# aliases
alias suicide='sudo rm -rf /'
# end aliases
# other commands
Ich möchte diesen Textblock durch einen anderen Text ersetzen, der zwischen zwei Markierungen in einer anderen Datei enthalten ist: stuff-to-place-in-bashrc.txt
# stuff-to-place-in-bashrc.txt
# ...stuff...
# aliases
alias ldir='ls * -d'
alias ithinklifeisworthliving='echo all good'
# end aliases
# ...more stuff...
ich habe es versucht
sed -ne 's/# aliases\s+\(.*\)\s+# end aliases/\1/' stuff-to-place-in-bashrc.txt
Aber ich schwinge hier wirklich im Dunkeln. Könnte mir jemand helfen?
Wie extrahiere ich den Text aus dem
stuff-to-place-in-bashrc.txt
?Wie ersetze ich den anderen Abschnitt
~/.bashrc
durch den extrahierten Text aus Frage 1?
Bearbeiten
Vielen Dank für die Updates, Leute, die sich fragen, warum ich so etwas möchte:
Ermöglicht ausgewählte Aktualisierungen von Skriptdateien, ohne benutzerdefinierte Ergänzungen zu überschreiben. nützlich für gemeinsam genutzte und häufig aktualisierte Standardbetriebsumgebungen (wie mein letzter Job bei Tyro , der mit XP codiert wurde).
verrückt werden Jungs.
quelle
# aliases
und# end aliases
), und es kann für Sie funktionieren.Antworten:
Ed ist der Standardeditor, da Sie damit Ed-Skripte entwickeln und seine Arbeit, wie Sie zuvor getestet haben, interaktiv ausführen können. Für kleine Dateien wie
.bashrc
oder jeden Codetext ist ed performant, da es die gesamte Datei in einem Ansturm liest und mit dem Puffer arbeitet. Aus dem gleichen Grund sollten Sie ed nicht für große Dateien wie Protokolldateien verwenden.Aber mit einem ed-Skript ist Ihre Arbeit in kürzester Zeit erledigt:
Ich verwende ähnliche Skripte, um Konfigurationsdateien automatisch zu optimieren, z. B. .asoundrc für verschiedene Umgebungen, in die ich meinen Laptop bringe.
Das beste Dokument über ed ist eine einfache Handbuchseite aus dem sehr coolen PLAN9- System. Ich habe es in ein ed.ps- Postscript-Dokument übersetzt. Wenn Sie an PLAN9 interessiert sind , sollten Sie 9front und http://cat-v.org/ überprüfen, da die ursprüngliche Bell Labs-Version weiterhin beibehalten wird, aber über ein sehr einfaches Dateisystem verfügt.
Ein letztes Wort zu Editor Wars, Emacs, Vim und dergleichen: Acme Rules!
quelle
w
,q
)/^# aliases
, und/^# end aliases/
) verwendet, und die anderen Befehle sind Vi / Ed. Siehe z. B. vimhelp.appspot.com/cmdline.txt.html#%3Arange für+, /^# end aliases/
.info Ed
auf Ihrem System (hoffentlich). Ich weiß nicht, warum moderne Linux-Distributionen diesen coolen Editor nicht installieren. w und q sind Schreib- und Beendigungsbefehle. Und ed funktioniert sehr ähnlich wie sed mit Regexen. Es gibt einen Grund, warum die Namen so ähnlich klingen. d bedeutet, dass die adressierten Zeilen gelöscht werden. -r liest die Ergebnisse des!
folgenden Befehls in die vorherige Zeile ein . Ich verkürze die Dateinamen in der Bearbeitung, da ich heute früh so faul schreibe.Wenn Sie die Datei direkt bearbeiten möchten,
ed
ist dies eine sehr gute Lösung. Wenn Sie es im Stream bearbeiten möchten, verwenden Siesed
. Vermeiden Siesed -i
.quelle
Sicher, Sie können dies
ed
alleine tun , ohne zusätzliche Tools zu benötigen:Wenn Sie mit dem Ergebnis zufrieden sind, ersetzen Sie es
,p
durchw /home/username/.bashrc
, um die Änderungen in zu schreiben~/.bashrc
(beachten Sie den vollständigen Pfad, der mitr
und verwendet wirdw
; Sie können ihn einfach verwenden,.bashrc
wenn er vorhanden istcwd
).So funktioniert das: Wir
d
löschen zuerst die nicht benötigten Zeilen ausstuff_to_place.txt
. Dann löschen wir die restlichen (die Aliase) mit,d
. Der Textpuffer ist jetzt leer, während der Schnittpuffer die gewünschten Zeilen enthält. Wirr
lesen dann den Inhalt von.bashrc
in den Textpuffer , setzen den Inhalt des Ausschneidepuffers (x
) hinter die/# aliases/
Zeile, duplizieren die zuletzt eingefügte Zeile (.t.
) und löschen sie aus der duplizierten Zeile bis einschließlich, aber nicht einschließlich/# end aliases/
und schließlichp
rint oderw
rite Änderungen undq
uit.quelle