Come scrivere l'intero buffer nell'output standard dalla riga di comando?


10

Vorrei scrivere l'intero buffer nell'output standard ( /dev/stdout) anziché nel file e il comando seguente funziona come previsto durante la modifica del file:

:w >> /dev/stdout

Suggerimento: premere Control+ Lper aggiornare lo schermo.

Ma non funziona come previsto quando sto provando a fare lo stesso dalla riga di comando ( non interattivamente ), ad esempio:

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

Lo stesso con :w !tee, :x! /dev/stdout, :%printe simili.

Prima di uscire, sta dicendo: [Device] 1L, 17C appended.

Esiste un modo per forzare Vim a scrivere l'input standard nell'output standard nel mezzo di una pipe? Forse è in qualche modo bufferizzato?


4
Solo curioso, cosa stai cercando di realizzare? Come in, cosa farà per te Vim che qualche altro strumento potrebbe non fare?
Jay Thompson,

1
@JayThompson Sto cercando di utilizzare vimper l'analisi dei file anziché sed(ad es. Modifiche complesse ripetute in serie su più file di grandi dimensioni). L'esempio non fa nulla per renderlo semplice e non creare potenziali duplicati di un altro post .
Kenorb,

Sai di Vipe, quindi per quale motivo non lo stai usando?
muru,

@muru Non l'ho ancora usato, non c'è molta documentazione disponibile ed è fuori tema qui.
Kenorb,

Le domande su Vipe potrebbero essere, ma non c'è motivo per cui non possa essere la risposta. Quindi mi chiedo perché non dovrei pubblicarlo come risposta.
Muru,

Risposte:


9

Per stampare buffer su shell standard di output, vimdeve iniziare in modalità Ex, altrimenti si aprirà in modo "normale" con la propria finestra e cancellerà eventuali buffer di output all'uscita.

Ecco l'esempio di lavoro più semplice:

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

o anche più breve:

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

Nota: il comando vim -eè sostanzialmente equivalente al excomando.

È necessario specificare un descrittore di file speciale per l'input standard ( /dev/stdin) per evitare messaggi fastidiosi extra (come spiegato di seguito).


Ed ecco alcuni esempi con le stringhe di analisi:

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

Nota: l'ultimo esempio mostra un messaggio fastidioso extra che non è possibile nasconderlo, è perché una strategia standard di leggere l'intero file in memoria e dire che è stato letto dallo standard input. Il primo esempio funziona senza il messaggio, poiché il file produce dati infiniti senza un segnale di fine file ( EOF ), quindi non raggiungerà mai la fine della sua lettura di input.


Relazionato:


1
Puoi semplicemente fare +q!piuttosto che +:q!, giusto?
Andrew,

@AndrewMacFie È la stessa cosa, aggiornata, grazie.
Kenorb,

3

vipeè uno strumento utile per la modifica di pipeline, parte del moreutilspacchetto. È un wrapper per editor (incluso quello viche gli dà il nome). Esso utilizza la EDITORvariabile d'ambiente per impostare l'editor, quindi, come con altri strumenti che fanno uso di EDITOR(come ad esempio crontab, visudoe così via), è possibile azioni di script che utilizzano tale variabile. Ad esempio, puoi cambiarlo per fare:

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

Ovviamente, azioni complicate potrebbero passare alla citazione dell'inferno, quindi potresti scrivere una sceneggiatura:

#! /bin/sh

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

E usare EDITOR="sh /path/to/script".

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.