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

时间:2018-10-25 12:58:59

标签: vim

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

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

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

...

:!jq .
[No write since last change]

:!jq .
[No write since last change]

...

有什么建议吗?

编辑

我可以例如:

 g/^\s\+{/p

这将起作用并打印出与我的图案匹配的所有行

1 个答案:

答案 0 :(得分:4)

如果我对您的理解正确,那么您有一个包含多个JSON文档的文件,每个文件都连接在一行上,现在您要使用jq .将每个这样的文档漂亮地打印成缩进的多行文件

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

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

:.!jq .命令将当前行:.作为 range 传递给jq命令,然后用命令的输出替换原始行,随心所欲。添加单个.可修复您的命令:

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