繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM