Як записати цілий буфер на стандартний вихід з командного рядка?


10

Я хотів би записати весь буфер у стандартний output ( /dev/stdout) замість файлу, і наступна команда працює, як очікувалося, під час редагування файлу:

:w >> /dev/stdout

Підказка: Натисніть Control+, Lщоб оновити екран.

Але це не працює, як очікувалося, коли я намагаюся зробити те ж саме з командного рядка ( неінтерактивно ), наприклад:

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

Ж з :w !tee, :x! /dev/stdout, :%printі аналогічні.

Перед тим як піти, він говорить: [Device] 1L, 17C appended.

Чи є який-небудь спосіб змусити vim записати стандартний вхід на стандартний вихід у середині труби? Може, це якось буферно?


4
Просто цікаво, що ви намагаєтеся досягти? Як у, що тут зробить vim, що якийсь інший інструмент може не зробити?
Джей Томпсон

1
@JayThompson Я намагаюся використовувати vimдля розбору файлів замість sed(наприклад, масових повторних складних змін у кількох великих файлах). Цей приклад не робить нічого, щоб зробити це просто і не робити потенційного дубліката іншої публікації .
kenorb

Ви знаєте про гадюку, тож з якої причини ви її не використовуєте?
муру

@muru Я його ще не використовував, не так багато документації, і тут це поза темою .
kenorb

Питання щодо гадюки може бути, але немає причин, на які не може бути відповіді. Тож мені цікаво, чому я не повинен розміщувати це як відповідь.
муру

Відповіді:


9

Для друку буфера до стандартного виводу оболонки vimпотрібно запустити його в режимі Ex, інакше він відкриє «звичайний» шлях із власним вікном та очистить будь-які вихідні буфери.

Ось найпростіший робочий приклад:

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

або навіть коротше:

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

Примітка: Команда vim -eв основному еквівалентна exкоманді.

Необхідно вказати спеціальний дескриптор файлу для стандартного введення ( /dev/stdin), щоб уникнути зайвих набридливих повідомлень (як пояснено нижче).


Ось кілька прикладів з розбором рядків:

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

Примітка. Останній приклад показує додаткове набридливе повідомлення, яке неможливо приховати, це тому, що стандартна стратегія зчитування всього файлу в пам'яті та вимови, що його читали зі стандартного вводу. Перший приклад працює без повідомлення, оскільки файл видає нескінченні дані без сигналу кінцевого файлу ( EOF ), тому він ніколи не досягне кінця його введення.


Пов'язані:


1
Можна просто зробити, +q!а не +:q!так?
Андрій

@AndrewMacFie Це те саме, оновлено, дякую.
kenorb

3

vipeє зручним інструментом для редагування трубопроводів, що є частиною moreutilsпакету. Це обгортка для редакторів (включаючи те, viщо дає їй свою назву). Він використовує EDITORзмінні середовища для установки редактора, так, як і з іншими інструментами , які використовують EDITOR(такі як crontab, visudoі т.д.), ви можете дію сценарію , використовуючи цей змінну. Наприклад, ви можете змінити це так:

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

Звичайно, складні дії можуть перетворитись на цитування пекла, тож ви можете написати сценарій:

#! /bin/sh

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

І використовувати EDITOR="sh /path/to/script".

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.