我想在匹配特定模式的每一行上运行
jq
,我尝试过:
:g/^\s\+{/!jq .
其中
^\s+{
是我的模式,但它不起作用。我收到很多这样的错误:
...
:!jq .
[No write since last change]
:!jq .
[No write since last change]
...
我可以使用类似的东西:
g/^\s\+{/p
它将工作并打印与我的模式匹配的所有行。
有什么建议吗?
如果我理解正确的话,你有一个包含多个 JSON 文档的文件,每个文档都连接在一行上,现在你想将每个这样的文档漂亮地打印成缩进的多行文档,并使用
jq .
您使用
:g/^\s\+{/
所做的是定位包含 JSON 文档的行,然后对其执行命令。问题在于 :!jq .
我编写它的方式,您可能已经认识到这是 :help :!cmd
,而您打算 filter 当前行(分布在多个后续行的 JSON 文档)也可以,但需要一个范围)。过滤命令略有不同; :help :range!
。
因此,对于
:!jq .
,Vim 只是使用 jq
参数启动外部 .
,但它不会将任何内容从缓冲区传递给它。这就是为什么 jq
只是坐在那里等待输入,直到您中止它(例如使用 <C-c>
)。
:.!jq .
命令将当前行 :.
作为 range 传递给 jq
命令,然后用命令的输出替换原始行,就像您想要的那样。添加单个 .
可以修复您的命令:
:g/^\s\+{/.!jq .