在jq中另一个匹配的行之前添加一个空行?

时间:2017-09-21 14:19:24

标签: json stream edit jq

说我有如下的原始输入:

"```"
"include <stdio.h>"
"..."
"```"
"''some example''"
"*bob"
"**bob"
"*bob"

我想在“* bob”之前添加一个空行:

"```"
"include <stdio.h>"
"..."
"```"
"''some example''"
""
"*bob"
"**bob"
"*bob"

这可以用jq完成吗?

2 个答案:

答案 0 :(得分:1)

是的,但要有效地做到这一点,你实际上需要jq 1.5或更高版本:

foreach inputs as $line (0; 
  if $line == "*bob" then . + 1 else . end;
  if . == 1 then "" else empty end,
    $line)

不要忘记使用-n命令行选项!

答案 1 :(得分:0)

这是使用-s(slurp)选项的另一种解决方案

.[: .[["*bob"]][0]] + ["\n"] + .[.[["*bob"]][0]:] | .[]        

这有点难以理解,但我们可以通过一些功能让它变得更好:

  def firstbob:  .[["*bob"]][0] ;
  def beforebob: .[: firstbob ] ;
  def afterbob:  .[ firstbob :] ;

    beforebob + ["\n"] + afterbob
  | .[]

如果上述过滤器位于filter.jq且样本数据位于data,那么

$ jq -Ms -f filter.jq data

产生

"```"
"include <stdio.h>"
"..."
"```"
"''some example''"
"\n"
"*bob"
"**bob"
"*bob"

这种方法的一个问题是,如果beforebob不在输入中,afterbob"*bob"将无法正常工作。解决这个问题的最简单方法是使用if guard:

    if firstbob then beforebob + ["\n"] + afterbob else . end
  | .[]

如果"*bob"不存在,输入将不会改变。