我想在匹配特定模式的每一行上运行jq
,
:g/^\s\+{/!jq .
其中^\s+{
是我的模式,但它不起作用。我收到很多这样的错误:
...
:!jq .
[No write since last change]
:!jq .
[No write since last change]
...
有什么建议吗?
编辑
我可以例如:
g/^\s\+{/p
这将起作用并打印出与我的图案匹配的所有行
答案 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 .