Wie bearbeite ich Dateien nicht interaktiv (zB in der Pipeline)?

24

Ich möchte Dateien bearbeiten, die in der Pipeline-Eingabe mit vim nicht interaktiv übergeben wurden, oder Dateien direkt bearbeiten (ähnlich wie sed).

Einige Beispiele mit sed:

$ sed -i'.bak' s/foo/test/g file   # Edit file in-place.
$ cat file | sed s/foo/test/g      # Parse file in pipeline.

Allerdings konnte ich in gelesen hier , dass:

sedist ein S tream ED itor, kein Datei-Editor. Nichtsdestotrotz neigen Menschen überall dazu, es für den Versuch, Dateien zu bearbeiten, zu missbrauchen. Es werden keine Dateien bearbeitet.

Zweitens sind einige Optionen wie In-Place-Bearbeitung ( -i) portierbar.

Wie kann die gleiche Funktionalität in vim erreicht werden?

Kenorb
quelle
Ich denke, Sie können die Sekunde filevon Ihrer zweiten Kommandozeile löschen.
Joeytwiddle
@joeytwiddle Fertig.
Kenorb

Antworten:

33

Um eine Datei nicht interaktiv zu bearbeiten ex( viist der visuelle Modus für ex), können Sie +{command}oder -c {command}Parameter verwenden, mit denen Sie die vi-Befehle ausführen können, nachdem die erste Datei gelesen wurde.

Dies exist ein Standard-Befehlszeileneditor (ähnlich dem ed).

Es sollte auch vipe(ein Vim-Befehlspipe-Editor) verwendet werden, der Teil des moreutilsPakets ist und es Ihnen ermöglicht, Ihren Editor in der Mitte einer Unix-Pipeline auszuführen und die Daten zu bearbeiten, die zwischen Programmen übertragen werden.

Beispiele

Mit dieser Shell-Syntax können einfache Standardeingaben und -ausgaben mithilfe von Pipes erzielt werden:

$ ex -sc'%p|q!' <(echo Example)
$ echo Example | ex -sc'%p|q!' /dev/stdin

Hier ist ein einfaches Beispiel, wie die Datei nach dem Ersetzen gedruckt wird:

$ ex /etc/hosts +%s/127/128/ge -sc'%p|q!'

Weitere Beispiele zum Bearbeiten von Dateien vor Ort:

$ ex +'%s/127/128/g' -cswq file
$ ex -sc '%s/olddomain\.com/newdomain.com/g|x' file
$ printf '%s\n' 'g/olddomain\.com/s//newdomain.com/g' w q | ex -s file
$ ex -s "$file" <<< $'g/old/s//new/g\nw\nq'
$ ex -sc 'argdo %s/old/new/ge|x' ./**
$ find . -type f -exec ex -sc '%s/old/new/g|x' {} \;

Sie können auch verwenden, -s {scriptin}um die Befehle aus der Datei zu laden. Beispiel:

$ printf "%s\n" '%s/foo/test/ge' 'wq' > cmds.vim
$ vim -s cmds.vim -es file

oder über die E / A-Umleitung:

$ vim file < cmds.vim

Überprüfen Sie die folgenden Beispiele, um eine Datei zu bearbeiten und die Änderungen in einer anderen zu speichern:

$ ex +%s/127/128/g -sc'wq! new_file' /etc/hosts
$ cat /etc/hosts /etc/fstab | vim - -es '+:%s/foo/test/g' '+:wq! file3'

Weitere praktische Beispiele.

Reales Live-Beispiel aus der RPM- Spezifikation:

vim -E -s Makefile <<-EOF
   :%substitute/CFLAGS = -g$/CFLAGS =-fPIC -DPIC -g/
   :%substitute/CFLAGS =$/CFLAGS =-fPIC -DPIC/
   :%substitute/ADAFLAGS =$/ADAFLAGS =-fPIC -DPIC/
   :update
   :quit
EOF

HTML-Tags extrahieren :

ex -s +'bufdo!/<div.*id=.the_div_id/norm nvatdggdG"2p' +'bufdo!%p' -cqa! *.html

XML-Tags entfernen :

ex -s +'%s/<[^>].\{-}>//ge' +%p +q! file.txt

Entfernen des Style-Tags aus der Kopfzeile und Drucken der analysierten Ausgabe:

curl -s http://example.com/ | ex -s +'/<style.*/norm nvatd' +%p -cq! /dev/stdin

Analysieren Sie HTML mit mehreren komplexen Regeln:

ex -V1 $PAGE <<-EOF
  " Correcting missing protocol, see: https://github.com/wkhtmltopdf/wkhtmltopdf/issues/2359 "
  %s,'//,'http://,ge
  %s,"//,"http://,ge
  " Correcting relative paths, see: https://github.com/wkhtmltopdf/wkhtmltopdf/issues/2359 "
  %s,[^,]\zs'/\ze[^>],'http://www.example.com/,ge
  %s,[^,]\zs"/\ze[^>],"http://www.example.com/,ge
  " Remove the margin on the left of the main block. "
  %s/id="doc_container"/id="doc_container" style="min-width:0px;margin-left : 0px;"/g
  %s/<div class="outer_page/<div style="margin: 0px;" class="outer_page/g
  " Remove useless html elements. "
  /<div.*id="global_header"/norm nvatd
  wq " Update changes and quit.
EOF

Noch mehr Beispiele:


Siehe auch:


Kenorb
quelle
5
Dies ist ein UUOC ; Verwenden Sie vim '+:0,$s/foo/test/g' '+:wq! file2' file1stattdessen einfach .
Türknauf
2
Beachten Sie, dass zumindest einige dieser Beispiele nicht POSIX-kompatibel sind bufdo. Obwohl Vim praktisch überall installiert ist, sollten Sie wissen, dass Sie die Skriptbearbeitung nur mit POSIX-kompatiblen Funktionen von ausführen könnenex .
Wildcard
Diese Frage und Antwort hat mich zuerst dazu inspiriert, sie zu untersuchen exund wirklich zu lernen. Vielen Dank. Eine weitere Lektüre zu diesem Thema (vollständige Offenlegung: Ich habe diese geschrieben;) ist: Umkehren aller vier Zeilen mitex und Verwenden der -cOption . Sie können sie zu Ihrer Linkliste unten hinzufügen, wenn Sie möchten. :)
Wildcard