Jak zapisać cały bufor na standardowe wyjście z wiersza poleceń?

10

Chciałbym napisać cały bufor do standardowego wyjścia ( /dev/stdout) zamiast do pliku, a następujące polecenie działa zgodnie z oczekiwaniami podczas edycji pliku:

:w >> /dev/stdout

Wskazówka: Naciśnij Control+, Laby odświeżyć ekran.

Ale to nie działa zgodnie z oczekiwaniami, gdy próbuję zrobić to samo z wiersza poleceń ( nieinteraktywnie ), na przykład:

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

Tak samo jest z :w !tee, :x! /dev/stdout, :%printi podobne.

Przed zamknięciem, to mówiąc: [Device] 1L, 17C appended.

Czy jest jakiś sposób na zmuszenie vima do zapisania standardowego wejścia na standardowe wyjście w środku potoku? Może jest jakoś zbuforowany?

kenorb
źródło
4
Ciekawe, co próbujesz osiągnąć? Jak w tym przypadku vim zrobi dla ciebie tutaj, że inne narzędzie może nie?
Jay Thompson
1
@JayThompson Staram się używać vimdo analizowania plików zamiast sed(np. Masowe powtarzające się złożone zmiany w wielu dużych plikach). Ten przykład nie robi nic, aby uprościć sprawę i nie tworzyć potencjalnej kopii innego postu .
kenorb
Wiesz o vipe, więc z jakiegoś powodu go nie używasz?
muru
@muru Jeszcze go nie użyłem, niewiele dokumentacji i tutaj jest nie na temat .
kenorb
Pytania dotyczące vipe mogą być, ale nie ma powodu, dla którego nie może to być odpowiedź. Zastanawiam się więc, dlaczego nie powinienem publikować tego jako odpowiedzi.
muru

Odpowiedzi:

9

Aby wydrukować bufor do standardowego wyjścia powłoki, vimnależy uruchomić w trybie Ex, w przeciwnym razie otworzy się „normalny” sposób z własnym oknem i wyczyści wszystkie bufory wyjściowe przy wyjściu.

Oto najprostszy działający przykład:

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

lub nawet krócej:

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

Uwaga: Polecenie vim -ejest zasadniczo równoważne expoleceniu.

Należy określić specjalny deskryptor pliku do standardowego wejścia ( /dev/stdin), aby uniknąć dodatkowych irytujących komunikatów (jak wyjaśniono poniżej).


A oto kilka przykładów z parsowaniem ciągów:

$ 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.

Uwaga: Ostatni przykład pokazuje dodatkową irytującą wiadomość, której nie można ukryć, ponieważ jest to standardowa strategia wczytywania całego pliku do pamięci i mówienia, że ​​został odczytany ze standardowego wejścia. Pierwszy przykład działa bez komunikatu, ponieważ plik generuje niekończące się dane bez sygnału końca pliku ( EOF ), więc nigdy nie osiągnie końca odczytu wejściowego.


Związane z:

kenorb
źródło
1
Można po prostu zrobić +q!, a nie +:q!, prawda?
Andrew
@AndrewMacFie To samo, zaktualizowane, dzięki.
kenorb
3

vipejest wygodnym narzędziem do edycji potoków, stanowiącym część moreutilspakietu. Jest to opakowanie dla redaktorów (w tym vinadające mu nazwę). Wykorzystuje ona EDITORzmienną środowiskową ustawić edytor, tak, jak w przypadku innych narzędzi, które wykorzystują EDITOR(takich jak crontab, visudoetc.), można działania skrypt za pomocą tej zmiennej. Na przykład możesz to zmienić, aby:

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

Oczywiście skomplikowane działania mogą prowadzić do cytowania piekła, więc możesz napisać skrypt:

#! /bin/sh

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

I użyj EDITOR="sh /path/to/script".

muru
źródło