在匹配模式的每一行上运行 shell 命令

问题描述 投票:0回答:1

我想在匹配特定模式的每一行上运行

jq
,我尝试过:

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

其中

^\s+{
是我的模式,但它不起作用。我收到很多这样的错误:

...

:!jq .
[No write since last change]

:!jq .
[No write since last change]

...

我可以使用类似的东西:

 g/^\s\+{/p

它将工作并打印与我的模式匹配的所有行。

有什么建议吗?

vim
1个回答
4
投票

如果我理解正确的话,你有一个包含多个 JSON 文档的文件,每个文档都连接在一行上,现在你想将每个这样的文档漂亮地打印成缩进的多行文档,并使用

jq .

您使用

:g/^\s\+{/
所做的是定位包含 JSON 文档的行,然后对其执行命令。问题在于
:!jq .
我编写它的方式,您可能已经认识到这是
:help :!cmd
,而您打算 filter 当前行(分布在多个后续行的 JSON 文档)也可以,但需要一个范围)。过滤命令略有不同;
:help :range!

因此,对于

:!jq .
,Vim 只是使用
jq
参数启动外部
.
,但它不会将任何内容从缓冲区传递给它。这就是为什么
jq
只是坐在那里等待输入,直到您中止它(例如使用
<C-c>
)。

:.!jq .
命令将当前行
:.
作为 range 传递给
jq
命令,然后用命令的输出替换原始行,就像您想要的那样。添加单个
.
可以修复您的命令:

:g/^\s\+{/.!jq .
© www.soinside.com 2019 - 2024. All rights reserved.