说我有如下的原始输入:
"```"
"include <stdio.h>"
"..."
"```"
"''some example''"
"*bob"
"**bob"
"*bob"
我想在“* bob”之前添加一个空行:
"```"
"include <stdio.h>"
"..."
"```"
"''some example''"
""
"*bob"
"**bob"
"*bob"
这可以用jq完成吗?
答案 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"
不存在,输入将不会改变。