[英]Run a shell command on every line matching pattern
我想在匹配特定模式的每一行上运行jq
,我尝试过:
:g/^\s\+{/!jq .
^\\s+{
是我的模式,但是它不起作用。 我收到很多这样的错误:
...
:!jq .
[No write since last change]
:!jq .
[No write since last change]
...
有什么建议么?
编辑
我可以例如:
g/^\s\+{/p
这将起作用并打印与我的图案匹配的所有行
如果我对您的理解正确,那么您有一个包含多个JSON文档的文件,每个文件都连接在一行上,现在您希望使用jq .
每个这样的文档漂亮地打印成缩进的多行文件jq .
:g/^\\s\\+{/
是查找带有JSON文档的行,然后在其上执行命令。 问题出在:!jq .
按照我的编写方式,您可能已经意识到这是:help :!cmd
,而您打算过滤当前行(散布在多行后续行中的JSON文档也可以,但是需要一个范围)。 过滤命令略有不同; :help :range!
。
因此,用:!jq .
,Vim只是jq
启动外部jq
.
参数,但不会将任何内容从缓冲区传递给它。 这就是为什么jq
只是坐在那里等待输入直到您中止它(例如,使用<Cc>
)的原因。
:.!jq .
命令改为传递当前行:.
作为jq
命令的范围 ,然后根据需要用命令的输出替换原始行。 加上那个.
修复您的命令:
:g/^\s\+{/.!jq .
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.