Запустите команду оболочки для каждой строки, соответствующей шаблону - PullRequest
0 голосов
/ 25 октября 2018

Я хотел бы запустить jq на каждой строке, соответствующей определенному шаблону, я пробовал:

:g/^\s\+{/!jq .

, где ^\s+{ - мой шаблон, но он не работает.Я получаю много ошибок, таких как:

...

:!jq .
[No write since last change]

:!jq .
[No write since last change]

...

Есть предложения?

РЕДАКТИРОВАТЬ

Я могу сделать, например:

 g/^\s\+{/p

, который будет работать и печатать все строки, соответствующие моему шаблону

1 Ответ

0 голосов
/ 25 октября 2018

Если я вас правильно понимаю, у вас есть файл с несколькими документами JSON, каждый из которых соединен в одну строку, и теперь вы хотите красиво распечатать каждый такой документ в многострочный с отступом с jq .

То, что вы делаете с :g/^\s\+{/, - это нахождение строк с документами JSON, а затем выполнение команды для него.Проблема в :!jq . Как я написал, вы можете уже признать, что это :help :!cmd, тогда как вы намеревались фильтровать текущую строку (документ JSON, распределенный по нескольким последовательным строкам, также будет работать, но требует диапазона).Команда фильтрации немного отличается;:help :range!.

Итак, с :!jq . Vim просто запускает внешний jq с аргументом ., но ничего из буфера ему не передает,Вот почему jq просто сидит и ждет ввода, пока вы не прервете его (например, с помощью <C-c>).

Команда :.!jq . вместо этого передает текущую строку :. как диапазон в команду jq, а затем заменяет исходную строку на вывод команды, как вы хотите.Добавление этого одиночного . исправляет вашу команду:

:g/^\s\+{/.!jq .
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...