8. Editieren von Files ====================== vi und andere Scheußlichkeiten, Reguläre Ausdrücke |
next | back | WS 2015/16 - 1 |
Klassische Editoren - eine Übersicht: ed - Sehr einfacher zeilenorientierter Editor. Funktioniert eigentlich immer. Ist nicht sehr benutzerfreundlich. sed - Steam-Editor. Nimmt einen Eingabedatenstrom und bearbeitet diesen. Wird üblicherweise nur von der Kommandozeile aus aufgerufen. vi - Sehr alter bildschirmorientierter Editor. Nahezu überall verfügbar. Die Bedienung ist gewöhnungsbedürftig, aber trotzdem alltagstauglich. emacs - Ursprüglich tastaturgesteuerter Editor. Unterstützt zahlreiche Funktionen außerhalb des Editierens von Dateien. nano - Leicht zu benutzender Editor für die Kommandozeile. Unter Linux fast immer verfügbar. Die Bedienung erklärt sich von selbst. Zahlreichre GUI-Editoren - xedit, kwrite, gedit, kate, ... Es gibt noch viele weitere Editoren für verschiedene Zwecke und mit verschiedenen Fähigkeiten. Zwischen vi (bzw. vim)-Nutzern und emacs-Nutzern gibt es regelrechte Religionskriege. |
next | back | WS 2015/16 - 2 |
Hier betrachtet: - nano - vi - emacs |
next | back | WS 2015/16 - 3 |
Der Editor nano =============== Motivation: Sehr einfach zu bedienen. Die gebräuchlichsten Tastenkombinationen werden ständig am unteren Bildschirmrand angezeigt. Nano ist auf vielen Systemen vorinstalliert. Aufruf: nano <Dateiname> Steuerkommandos: Cursorpositionierung mit den Pfeiltasten. Tastenkombinationen: Ctrl-O Speichern Ctrl-X Schließen |
next | back | WS 2015/16 - 4 |
Der Editor vi ============= Motivation: Auf den meisten Systemen verfügbar. Sehr mächtig. Kann sehr stark an die eigenen Bedürfnisse angepasst werden. Varianten von vi: vim, gvim Aufruf: vi [-r] [-R] <datei> -r - recover - Editieren der Datei <datei>, deren Änderung vorher nicht beendet wurde (Systemabsturz, vi-Abbruch) -R - read only - Datei nur zum Lesen öffnen (view) <datei> - Datei, die bearbeitet werden soll z.B. vi b1 view b1 vi -r b2 vi ist vom Termnial abhängig und wird nicht überall gleich dargestellt! Prüfen ob das Terminal vom System unterstützt wird: tput -T $TERM longname Umgebungsvariable TERM setzen (sh, bash): export TERM=<Terminal> |
next | back | WS 2015/16 - 5 |
Arbeitszustände des vi ---------------------- vi ist ein Modusbasierter Editor. Befehlsmodus - Navigation im File, Ausführen verschiedener (Normal mode) Operationen auf Text, Standardmodus (wird nach dem Start angezeigt) Einfügemodus - Schreiben von Text (Insert mode) Kommandozeilenmodus - Ausführen von ex-Kommandos (zeilenorientiert, (Command mode) ähnlich ed) Moduswechsel: Normal mode -> Insert mode i, a, o, R, ... Normal mode -> Command mode : Insert Mode -> Normal mode <ESC>, <CTRL>-C Command Mode -> Normal mode <ESC>, [Kommando]<ENTER>, <CTRL>-C |
next | back | WS 2015/16 - 6 |
Wichtige vi-Kommandos --------------------- Cursor positionieren: (Kommando wird nicht angezeigt): h - Cursor ein Zeichen nach links (Cursor-Taste erlaubt) j - Cursor eine Zeile runter (Cursor-Taste erlaubt) k - Cursor eine Zeile hoch (Cursor-Taste erlaubt) l - Cursor ein Zeichen nach rechts (Cursor-Taste erlaubt) w - Cursor ein Wort nach rechts (über Zeilenende hinaus) G - Cursor auf letzte Zeile positonieren <nn>G - Cursor auf <nn>-te Zeile positionieren. 0 - Cursor am Zeilenanfang positionieren $ - Cursor am Zeilenende positionieren Cursor positionieren durch Suchen: /<string> - suche String vorwärts ?<string> - suche String rückwärts n - wiederholen des letzten Suchkommandos N - wiederholen des letzten Suchkommandos rückwärts |
next | back | WS 2015/16 - 7 |
File verändern: (Kommando wird nicht angezeigt): x - Zeichen unter Cursor löschen dw - Wort ab Cursor bis Wortende löschen dd - Zeile unter Cursor löschen r<Zeichen> - Zeichen unter Cursor ersetzen J - nachfolgende Zeile wird an die aktuelle Zeile angehangen u - undo - letzte Änderung rückgängig machen eventuell mehrfach anwendbar a<Text><ESC> - einfügen des Textes <Text> nach dem Cursor (auch mehrere Zeilen) A<Text><ESC> - einfügen des Textes <Text> am Ende der Zeile (auch mehrere Zeilen) i<Text><ESC> - einfügen des Textes <Text> vor dem Cursor (auch mehrere Zeilen) I<Text><ESC> - einfügen des Textes <Text> am Anfang der Zeile (auch mehrere Zeilen) o<Text><ESC> - einfügen des Textes <Text> vor der aktuellen Zeile (auch mehrere Zeilen) O<Text><ESC> - einfügen des Textes <Text> nach der aktullen Zeile (auch mehrere Zeilen) R<Text><ESC> - Wort ab Cursor durch Text <Text> ersetzen |
next | back | WS 2015/16 - 8 |
Änderung speichern und vi verlassen: ZZ - File schreiben und vi verlassen :wq - File schreiben und vi verlassen :w - File schreiben :q - vi verlassen (wenn nichts geändert wurde) :q! - vi immer verlassen ohne Speicherung der Änderungen |
next | back | WS 2015/16 - 9 |
Weitere sinnvolle vi-Kommandos ------------------------------ s<Text><ESC> - Zeichen an der Cursorposition duch Text <Text> ersetzen (auch mehrere Zeilen) <nn>s<Text><ESC> - <nn> Zeichen an der Cursorposition duch Text <Text> ersetzen (auch mehrere Zeilen) S<Text><ESC> - aktuelle Zeile duch Text <Text> ersetzen (auch mehrere Zeilen) :s/<alt>/<neu> - in der aktuellen Zeile Zeichenkette <alt> durch Zeichenkette <neu> ersetzen (einmalig) :s/<alt>/<neu>/g - in der aktuellen Zeile Zeichenkette <alt> durch Zeichenkette <neu> ersetzen (mehrmalig) :1,$s/<alt>/<neu> - im gesammten File Zeichenkette <alt> durch Zeichenkette <neu> maximal einmal pro Zeile ersetzen. :1,$s/<alt>/<neu>/g - im gesammten File Zeichenkette <alt> durch Zeichenkette <neu> ersetzen (mehrmalig) :r <Dateiname> - Einlese der Datei <Dateiname> hinter die aktuelle Zeile :e <Dateiname> - Editieren des Files <Dateiname> . - Ausführen der letzten Änderung im File an der aktuellen Position des Cursors :<nn> - Gehe zur <nn>-ten Zeile |
next | back | WS 2015/16 - 10 |
Kurzer Ausflug zu den regulären Ausdrücken ------------------------------------------ Reguläre Ausdrücke werden von vielen Programmen im Unix benutzt um Zeichen- ketten zu beschreiben. Dabei sollen nicht nur einzelne Zeichenketten beschrieben werden, sondern Mengen von Zeichenketten. Reguläre Ausdrücke sind also Muster für Zeichenketten. Sie bestehen aus: normalen Zeichen des Alphabets, z.B. 0-9, a-z, A-Z, Sonderzeichen ungleich Metazeichen und Metazeichen: . * ^ $ [ ] \ Ein einfacher regulärer Ausdruck besteht aus: - einem normalen Zeichen des Alphabets - dem Metazeichen "\" gefolgt von einem weiteren Metazeichen dadurch wird das Metazeichen selbst Zeichen des Ausdrucks (ein Zeichen) - Metazeichen "^" - stellt den Zeilenanfang dar - Metazeichen "$" - stellt das Zeilenende dar - Metazeichen "." - stellt ein beliebiges Zeichen dar |
next | back | WS 2015/16 - 11 |
- Metazeichen: [...] - stellt ein Zeichen aus der Menge, der durch "[" und "]" eingeschlossenen Zeichen dar Abkürzung ist zulässig, z.B. [a-z] - alle Kleinbuchstaben [a-zA-Z] - alle Buchstaben [0-9] - alle Ziffern [m-s] - die Buchstaben mnopqrs - Metazeichen: [^...] - stellt ein Zeichen aus der Komplementmenge von [...] dar. [^a-z] - alle Zeichen außer Kleinbuch- staben Operatoren über einfache reguläre Ausdrücke - Konkatenation (Verkettung): <Z1><Z2> Z1 unmittelbar gefolgt von Z2. Z1, Z2 sind Zeichen oder Metazeichen "an" beschreibt also eine Zeichenkette, die die Buchstaben "a" und "n" unmittelbar hintereinander enthaelt, also: "an", "anders", "Kanne" - Gruppierungen: \(<regulaerer-Ausdruck>\) bedeuten das Gleiche wie <regulaerer-Ausdruck> also: "\(abc\)" entspricht "abc" |
next | back | WS 2015/16 - 12 |
- Häufigkeiten: <Z1>* : kein, einmaliges oder mehrmaliges Auftreten des Zeichens <Z1> "al*es entspricht "aes", "ales", "alles", "allles", "alllllles", ... <Z1>\{m\}: m-maliges Auftreten des Zeichens <Z1> "al\{2\}es" entspricht nur "alles" <Z1>\{m,\}: mindestens m-maliges Auftreten des Zeichens <Z1> "al\{2,\}es" entspricht "alles", "allles", .... <Z1>\{m,n\}: m- bis n-maliges Auftreten des Zeichens <Z1> "al\{2,3\}es" entspricht genau "alles" und "allles" |
next | back | WS 2015/16 - 13 |
Einige Beispiele: 1,$p /^meins/p /^$/n /^[ ]*$/n /ales/,/al*/p /ales/,/all*/p /ale*/p /ale*/n /ale./ /al.les/p /al.*les/p /a[lb]*es/p /.al/p /al\{3\}es/p /al\{2,3\}es/p /a[bl]\{2,3\}es/p /\(alles\)/p /\(alles \)*/p /\(alles \)\{2\}/p /\(alles \)\{1,\}/p /\(alles \)\{1,2\}/p noch eine Steigerung /\(alles\) \1/p /\([a-zA-Z]\{1,\}\) \1/p |
next | back | WS 2015/16 - 14 |
Weitere Positionierkommandos zum Blättern ---------------------------------------- <cntrl>f - Eine Bildschirm vorwärts blättern <cntrl>b - Eine Bildschirm rückwärts blättern <cntrl>d - Eine halben Bildschirm vorwärts blättern <cntrl>u - Eine halben Bildschirm rückwärts blättern |
next | back | WS 2015/16 - 15 |
Pufferverwaltung ---------------- Der vi benutzt Puffer, um sich einzelne oder mehrere Zeilen zu merken. Es gibt einen allgemeinen Puffer, der bei bestimmten Kommandos automatisch gefüllt wird und die nutzerspezifischen Puffer mit den Namen a,b,c,d,...,z. Kommandos für die Pufferverwaltung des allgemeinen Puffers: yy oder Y - aktuelle Cursorzeile in den allgemeinen Puffer kopieren <nn>yy - <nn>Y - <nn> Zeilen einschließlich der aktuellen Cursozeile in den allgemeinen Puffer kopieren dd - aktuelle Cursorzeile löschen und in den allgemeinen Puffer übernehmen <nn>dd - <nn> Zeilen einschließlich der aktuellen Cursorzeile löschen und in den allgemeinen Puffer übernehmen p - (put) allgemeinen Puffer hinter die aktuelle Cursorzeile kopieren P - (Put) allgemeinen Puffer vor die aktuelle Cursorzeile kopieren |
next | back | WS 2015/16 - 16 |
Kommandos für die Pufferverwaltung von nutzerspezifischen Puffern: <puffer> (einzelner Buchstabe) "<puffer>yy - aktuelle Cursorzeile in den Puffer <puffer> übernehmen "<puffer><nn>yy - <nn> Zeilen einschlißlich der aktuelle Cursorzeile in den Puffer <puffer> übernehmen "<puffer>dd - aktuelle Cursorzeile löschen und in den Puffer <puffer> kopieren "<puffer><nn>dd - <nn> Zeilen einschlißlich der aktuelle Cursorzeile löschen und in den Puffer <puffer> kopieren "<puffer>p - (put) Puffer <puffer> hinter die aktuelle Cursorzeile kopieren "<puffer>P - (put) Puffer <puffer> vor die aktuelle Cursorzeile kopieren |
next | back | WS 2015/16 - 17 |
Textobjekte im vi ----------------- Textobjekte müssen für folgende vi-Kommandos spezifziert werden: c - ändern d - löschen y - sichern Folgende Textobjekte werden unterstützt: Worte, Sätze, Absätze, Abschnitte Worte - Folge von Buchstaben, Ziffern und Unterstreichungsstrichen Wort-Textobjekte: w - Wort ab Cursorposition bis Interpunktionszeichen nach rechts (ausschließlich) W - Wort ab Cursorposition bis Interpunktionszeichen nach rechts (einschließlich) b - Wort ab Cursorposition bis Interpunktionszeichen nach links (ausschließlich) B - Wort ab Cursorposition bis Interpunktionszeichen nach links (einschließlich) e - Ende eines Worts ab Cursorposition nach rechts ohne Interpunktionszeichen E - Ende eines Worts ab Cursorposition nach rechts mit Interpunktionszeichen |
next | back | WS 2015/16 - 18 |
Satz:- Folge von Wörtern ohne ".", "!", "?", Leerzeilen Satz-Textobjekte: ( - Anfang des momentanen Satzes ) - Ende des momentanen Satzes Absatz - bis zur nächsten Leerzeile oder bis zur nächsten Zeichenfolge, die durch den "paragraph"-Wert definiert wird. Definition des "paragraph"-Wertes: :set paragraphs= Absatz-Textobjekte: { - Anfang des momentanen Paragraphs } - Ende des momentanen Paragraphs Sektion - bis zur nächsten Zeichenfolge, die durch den "sections"-Wert definiert wird. Definition des "paragraph"-Wertes: :set sections= [[ - Anfang der momentanen Sektion ]] - Ende der momentanen Sektion |
next | back | WS 2015/16 - 19 |
Sonstige Positionierkommandos ------------------------------ ^ - rückwärts bis Zeilenanfang $ - vorwäts bis Zeilenende G - vorwärts bis Dateiende <nn>G - vorwärts bzw. rückwärts bis zur <nn>-ten Zeile |
next | back | WS 2015/16 - 20 |
Einige Hilfskommandos ---------------------- :!<UNIX-Kommando> - Ausführen des UNIX-Kommandos <UNIX-Kommando> <cntl>l - Bildschirm neu aufbauen z <NL> - Aktuelle Cursorzeile wird an den oberen Bildschirmrand verschoben (scrollen) z. - Aktuelle Cursorzeile wird in die Mitte des Bildschirms verschoben (scrollen) z+,z- - aktuelle Cursorzeile vorwärts und rückwärts scrollen |
next | back | WS 2015/16 - 21 |
set-Optionen ------------ Durch Optionen werden die Eigenschaften des vi beeinflußt. Die Optionen können im File ~/.exrc oder ~/.vimrc abgelegt werden, so daß sie beim Starten des vi sofort gesetzt sind. Optionen könenn durch ":set" manipuliert werden. :set <option>=<Wert> - Wert eintragen :set <option> - Option einschalten :set <no-option> - Option ausschalten :set <option>? - Option anzeigen :set all - Alle Optionen anzeigen :set - geänderte Optionen anzeigen :syntax on - Syntaxprüfung einschalten :gui - grafische Oberfläche einschalten Abkürzungen für Optionsnamen sind zulässig. <option> autoident (ai,noai) - Automatisches einrücken autowrite (aw,noaw) - Automatisches sichern (verstärkt) ignorecase (ic,noic) - Groß- und Kleinbuchstaben beim Suchen ignorieren list (list,nolist) - Anzeigen von Tabulatorenzeichen magic (magic,nomagic) - Bedeutung von Metazeichen für reguläre Ausdrücke einschalten, sonst nur ^ und $ unterstützt number (nu,nonu) - Zeilennummerierung einschalten shiftwidth (sw=,sw=8) - Länge der Softwaretabulatoren bestimmen |
next | back | WS 2015/16 - 22 |
Zum Üben für jeden zu Hause: vimtutor |
next | back | WS 2015/16 - 23 |
Der Editor emacs ================ emacs ist einer der mächtigsten Editoren im UNIX. Er ist beliebig erweiterbar und programmierbar. Erfinder: Richard Stallmann (Free Software Foundation) Ähnlich vi mit gvim gibt es eine GUI-Variante von emacs - xemacs. emacs befindet sich nach dem Start immer im Eingabemodus Cursortasten, Scroll-Tasten und Maus können zur Positionierung benutztwerden. Steuerkommandos beginnen mit: <CNTL> <ALT> <CNTL>+<SHIFT> <ALT>+<SHIFT> Für emacs-Kommandos gibt es zwei Eingabemöglichkeiten: 1. Steuerkommando-Anfang + Kommandobuchstabe 2. <ALT>+X <Kommandoname> <Enter> z.B. streichen eines Zeichens: <CNTL>D <ALT>+X delete-char Sollte <ALT>+X nicht unterstützt werden, so funktioniert <ESC>+X |
next | back | WS 2015/16 - 24 |
Starten und Beenden des emacs ----------------------------- starten: emacs <dateiname> beenden: <CNTL>X<CNTL>C emacs fragt nach, ob gespeichert werden soll Laden und Speichern von Dateien ------------------------------- <CNTL>X<CNTL>F <dateiname> - Laden einer Datei <CNTL>X<CNTL>W <dateiname> - Schreiben einer Datei <CNTL>X<CNTL>S - Schreiben aller Dateien <CNTL>X S - Schreiben aller Dateien <CNTL>X I - Datei einfügen <CNTL>Z - emacs in den Hintergrund Cursor positionieren -------------------- Cursortasten, Seite vorwärts, Seite rückwärts <ALT> < - Dateianfang <ALT> > - Dateiende <ALT>X gotoline <enter> nn - gehe zu Zeile nn ( <ALT>M? ) <ALT>X line-number-mode - Zeilennummerierung ein-/ausschalten |
next | back | WS 2015/16 - 25 |
Löschen ------- <Backspace-Taste> - Zeichen löschen <CNTL>D - Zeichen löschen <ALT>D - Wort löschen <CNTL>K - bis Zeilenende löschen <ALT>0<CNTL>K - bis Zeilenanfang löschen (<ALT> NULL <CNTL>K) Suchen ------ <CNTL>S <Suchtext> - vorwärts suchen <CNTL>S <ALT>N - weiter vorwärts suchen <CNTL>R <Suchtext> - rückwärts suchen <CNTL>S <ALT>P - weiter rückwärts suchen Suchtext ist String <CNTL><ALT>S <Suchtext> - vorwärts suchen <CNTL><ALT>R <Suchtext> - rückwärts suchen Suchtext ist regulärer Ausdruck |
next | back | WS 2015/16 - 26 |
Editierkommandos ---------------- <ALT>X overwrite-mode - umschalten zwischen Overwrite- und Insert- Modus <ALT>C - Buchstabe unter Kursor groß, den Rest des Wortes klein <ALT>L - Buchstabe unter Kursor klein, den Rest des Wortes klein <CNTL>T - Vertauschen von zwei Buchstaben <ALT>T - Vertauschen von zwei Wörtern Online-Hilfe ------------ <F1> - F1-Taste <F1><F1> - Übersicht über Hilfsmemü <F1> a <Schlüsselwort> - Hilfstexte zum Thema des Schlüsselwortes <F1> b - Übersicht Tastenkürzel <F1> f <Kommando> - Übersicht zum Kommando <Kommando> |
next | back | WS 2015/16 - 27 |
Aufruf von UNIX-Kommandos ------------------------- <ESC>!<kommando> - Ausführen des Kommandos <Kommando> Ergebnis wird in einem anderen Fenster angezeigt Fenster kann mit <CNTL>X0 gelöscht werden. <ALT>x shell - Starten einer Shell im Fenster und vieles Andere mehr |
back | WS 2015/16 - 28 |