Wie schreibe ich den gesamten Puffer über die Befehlszeile in die Standardausgabe?

10

Ich möchte /dev/stdoutanstelle der Datei den gesamten Puffer in die Standardausgabe ( ) schreiben, und der folgende Befehl funktioniert beim Bearbeiten der Datei wie erwartet:

:w >> /dev/stdout

Tipp: Drücken Sie Control+ L, um den Bildschirm zu aktualisieren.

Aber es funktioniert nicht wie erwartet, wenn ich versuche, dasselbe über die Befehlszeile ( nicht interaktiv ) zu tun , zum Beispiel:

$ echo This is example. | vim - '+:w >> /dev/stdout' '+:q!'
Vim: Reading from stdin...

Das gleiche :w !teegilt für :x! /dev/stdout,, :%printund ähnliches.

Vor dem Beenden heißt es : [Device] 1L, 17C appended.

Gibt es eine Möglichkeit, vim zu zwingen, die Standardeingabe in die Standardausgabe in der Mitte einer Pipe zu schreiben? Vielleicht ist es irgendwie gepuffert?

Kenorb
quelle
4
Nur neugierig, was versuchst du zu erreichen? Was wird vim hier für Sie tun, was ein anderes Tool möglicherweise nicht tut?
Jay Thompson
1
@ JayThompson Ich versuche, vimanstelle von sed(z. B. massenweise wiederholte komplexe Änderungen an mehreren großen Dateien) das Parsen von Dateien zu verwenden. Das Beispiel tut nichts, um es einfach zu halten und kein potenzielles Duplikat eines anderen Beitrags zu erstellen .
Kenorb
Sie kennen sich mit Vipe aus, warum verwenden Sie es also nicht?
Muru
@muru Ich habe es noch nicht benutzt, es ist nicht viel Dokumentation verfügbar und es ist hier nicht zum Thema .
Kenorb
Fragen zu Vipe mögen sein, aber es gibt keinen Grund, warum es nicht die Antwort sein kann. Ich frage mich also, warum ich es nicht als Antwort posten sollte.
Muru

Antworten:

9

Um einen Puffer für die Shell-Standardausgabe zu drucken, vimmuss er im Ex-Modus gestartet werden. Andernfalls wird der "normale" Weg mit einem eigenen Fenster geöffnet und alle Ausgabepuffer beim Beenden werden gelöscht.

Hier ist das einfachste Arbeitsbeispiel:

$ echo foo | vim -e '+%print' '+q!' /dev/stdin
foo

oder noch kürzer:

$ echo foo | ex +%p -cq! /dev/stdin
$ echo foo | ex +"%p|q!" /dev/stdin

Hinweis: Der Befehl entspricht vim -eim Wesentlichen dem exBefehl.

Es muss ein spezieller Dateideskriptor für die Standardeingabe angegeben werden ( /dev/stdin), um zusätzliche störende Nachrichten zu vermeiden (wie unten erläutert).


Und hier sind einige Beispiele mit Parsing-Strings:

$ echo This is example. | vim -e '+s/example/test/g' '+%print' '+q!' /dev/stdin
This is test.
$ echo This is example. | vim - -es '+s/example/test/g' '+%print' '+q!'
Vim: Reading from stdin...
This is test.

Hinweis: Das letzte Beispiel zeigt eine besonders ärgerliche Nachricht, die nicht ausgeblendet werden kann. Dies liegt daran, dass eine Standardstrategie darin besteht, die gesamte Datei in den Speicher einzulesen und zu sagen, dass sie von der Standardeingabe gelesen wurde. Das erste Beispiel funktioniert ohne die Nachricht, da die Datei endlose Daten ohne EOF- Signal (End-of-File ) erzeugt, sodass sie niemals das Ende ihrer Eingangslesung erreicht.


Verbunden:

Kenorb
quelle
1
Sie können einfach +q!eher tun als +:q!, oder?
Andrew
@ AndrewMacFie Es ist das gleiche, aktualisiert, danke.
Kenorb
3

vipeist ein praktisches Tool zum Bearbeiten von Pipelines, das Teil des moreutilsPakets ist. Es ist ein Wrapper für Redakteure (einschließlich des, vider ihm seinen Namen gibt). Es nutzt die EDITORUmgebungsvariable den Editor zu setzen, so wie mit anderen Werkzeugen , die Gebrauch machen EDITOR(wie zB crontab, visudousw.), können Sie Script - Aktionen verwenden diese Variable. Sie können es beispielsweise folgendermaßen ändern:

$ echo foo | EDITOR='vim +:s/foo/bar/ +wq' vipe | tail
bar

Natürlich können komplizierte Aktionen dazu führen, dass die Hölle zitiert wird, sodass Sie ein Skript schreiben können:

#! /bin/sh

vim "+:s/foo/bar" '+wq' "$@"

Und verwenden EDITOR="sh /path/to/script".

muru
quelle