代码之家  ›  专栏  ›  技术社区  ›  Patryk

对每个匹配模式的行运行shell命令

vim
  •  1
  • Patryk  · 技术社区  · 7 年前

    我想跑步 jq 在每一行匹配一个特定的模式,我尝试了:

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

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

    ...
    
    :!jq .
    [No write since last change]
    
    :!jq .
    [No write since last change]
    
    ...
    

    例如,我可以做:

     g/^\s\+{/p
    

    1 回复  |  直到 7 年前
        1
  •  4
  •   Ingo Karkat    7 年前

    jq .

    你用什么 :g/^\s\+{/ 使用JSON文档定位行,然后对其执行命令。问题出在 :!jq . :help :!cmd ,而你本打算 当前行(跨多个后续行的JSON文档也可以工作,但需要一个范围)。过滤命令略有不同; :help :range!

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

    这个 :.!jq . :. 作为一个 范围 jq公司 命令,然后将原始行替换为命令的输出,如您所愿。加上那个单曲 . 修复您的命令:

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