Nützliche Linux-Befehle: So verwenden Sie den vi-Editor

man page: man vi

vi is a shell based editor which is available on nearly every linux installation. It's very useful to have a basic understanding how it works because sometimes it is the only option to change something. This post describes the basics plus some additional hints which I find useful.

Siehe auch: Nützliche Linux Befehle

Zusammenfassung

BefehlErklärung
vi filename.txtfilename.txt im Editor öffnen, kann auch verwendet werden, um eine neue Datei mit diesem Namen zu erstellen
:qBeenden ohne zu speichern
:q!ohne Speichern beenden und Änderungen nicht speichern (falls vorhanden)
:wqmit Speichern beenden
:wq!mit Speichern beenden (obwohl es vielleicht eine schreibgeschützte Datei ist)
igehe in den Bearbeitungsmodus
EscMode verlassen
ddZeile löschen, in der sich der Cursor befindet
Gzur letzten Zeile in der Datei springen
ggzur ersten Zeile in der Datei springen

Editiersitzung starten und beenden

Der folgende Befehl öffnet eine Datei mit vi

vi filename.txt

In diesem Beispiel verwenden wir eine docker-compose.yaml

version: '3'
services:
  web:
    build: btapp
    network_mode: host
    container_name: btapp
    environment:
      JAVA_OPTS: "-XX:+UseContainerSupport -XX:+UseG1GC -XX:+PrintGC -Xms1024m -Xmx1024m"
    ports:
      - "443:443"
      - "80:80"
    volumes:
      - ./btapp/log:/log
      - ./btapp/crt:/crt

Um die Sitzung zu beenden, drückt man Escape und gibt :q (Beenden) ein. Das Escape wird benötigt, im den Edit Modus zu verlassen. Ich habe mich daran gewöhnt, immer zuerst Esc zu drücken, damit ich nicht darüber nachdenken muss, in welchem ​​Modus ich mich befinde.

version: '3'
services:
  web:
    build: btapp
    network_mode: host
    container_name: btapp
    environment:
      JAVA_OPTS: "-XX:+UseContainerSupport -XX:+UseG1GC -XX:+PrintGC -Xms1024m -Xmx1024m"
    ports:
      - "443:443"
      - "80:80"
    volumes:
      - ./btapp/log:/log
      - ./btapp/crt:/crt
~                                                                               
~                                                                               
~                                                                                                                                                                                                                            
:q

Wenn etwas geändert wurde, warnt vi mit der Meldung

E37: No write since last change (add ! to override)

Um ohne Speichern zu beenden, muss man in diesem Fall :q! eingeben.

Um die Änderungen zu speichern, gibt man :wq (write quit) ein. Manchmal ändert man eine Datei, die als schreibgeschützt markiert ist. In diesem Fall kann man die Änderungen immer noch mit :wq! speichern.

Datei Inhalt ändern

Um die Datei zu ändern, bewegt man den Cursor auf eine Zeile und drückt i. Jetzt kann man die Datei wie gewohnt ändern und den Cursor mit den Pfeilen bewegen.

Man kann Inhalte auch über das Terminal an der Cursorposition einfügen.

Um den Bearbeitungsmodus zu verlassen, drückt man einfach die Escape-Taste und man kann die Datei mit oder ohne Speichern verlassen (siehe oben).

Um eine ganze Zeile zu löschen, kann man dd drücken, wenn sich der Cursor im Nicht-Bearbeitungsmodus in der richtigen Zeile befindet.

Suchen und Ersetzen

vi bietet eine mächtige Suchfunktionen über Befehle. Um in den Suchmodus zu wechseln, gibt man Esc ein und gibt /{searchString} ein, um zum nächsten Vorkommen dieser Zeichenfolge zu springen.

version: '3'
services:
  web:
    build: btapp
    network_mode: host
    container_name: btapp
    environment:
      JAVA_OPTS: "-XX:+UseContainerSupport -XX:+UseG1GC -XX:+PrintGC -Xms1024m -Xmx1024m"
    ports:
      - "443:443"  # <- cursor jumps here
      - "80:80"
    volumes:
      - ./btapp/log:/log
      - ./btapp/crt:/crt
~                                                                               
~                                                                               
~                                                                                                                                                                                                                            
/443

Man kann die gesamte Datei auch direkt nach allen Vorkommen des Suchbegriffs mit einem vorangestellten :g durchsuchen.

version: '3'
services:
  web:
    build: btapp
    network_mode: host
    container_name: btapp
    environment:
      JAVA_OPTS: "-XX:+UseContainerSupport -XX:+UseG1GC -XX:+PrintGC -Xms1024m -Xmx1024m"
    ports:
      - "443:443"
      - "80:80"
    volumes:
      - ./btapp/log:/log
      - ./btapp/crt:/crt
~                                                                               
~                                                                               
~                                                                                                                                                                                                                            
:g/btapp
    build: btapp
    container_name: btapp
      - ./btapp/log:/log
      - ./btapp/crt:/crt
Press ENTER or type command to continue

Der Suchbefehl kann auch mit Regex-Suchmustern umgehen. Im nächsten Beispiel suchen wir nach allen Zeilen, in denen die Zeichennummer 11 ein Leerzeichen ist.

version: '3'
services:
  web:
    build: btapp
    network_mode: host
    container_name: btapp
    environment:
      JAVA_OPTS: "-XX:+UseContainerSupport -XX:+UseG1GC -XX:+PrintGC -Xms1024m -Xmx1024m"
    ports:
      - "443:443"
      - "80:80"
    volumes:
      - ./btapp/log:/log
      - ./btapp/crt:/crt
~                                                                               
~                                                                               
~            
:g/^.\{10}\s
    build: btapp
Press ENTER or type command to continue                                                   

Man kann zum Beispiel auch alle Zeilen löschen, auf die die Regex passt, indem man direkt /d am Ende hinzufügt.

version: '3'
services:
  web:
    build: btapp
    network_mode: host
    container_name: btapp
    environment:
      JAVA_OPTS: "-XX:+UseContainerSupport -XX:+UseG1GC -XX:+PrintGC -Xms1024m -Xmx1024m"
    ports:
      - "443:443"
      - "80:80"
    volumes:
      - ./btapp/log:/log
      - ./btapp/crt:/crt
~                                                                               
~                                                                               
~            
:g/^.\{10}\s/d

was das Resultat gibt:

version: '3'
services:
  web:
    network_mode: host
    container_name: btapp
    environment:
      JAVA_OPTS: "-XX:+UseContainerSupport -XX:+UseG1GC -XX:+PrintGC -Xms1024m -Xmx1024m"
    ports:
      - "443:443"
      - "80:80"
    volumes:
      - ./btapp/log:/log
      - ./btapp/crt:/crt
~
~                                                                               
~                                                                               
~     

Problem: vi fügt bei Cursorbewegung Zeichen hinzu

Auf manchen Systemen könnte das Problem auftreten, dass die Cursorbewegung mit den Pfeiltasten im Bearbeitungsmodus dazu führt, dass vi die Zeichen A, B, C oder D hinzufügt. Um dies zu beheben, fügt man eine Datei im Home-Verzeichnis des aktuellen Benutzers wie folgt hinzu:

user1@pi:~ $ cat .vimrc 
set nocompatible

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert