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 |