这是yaml文件:
tasks:
test: {include: [bash_exec], args:['-c', 'state --m=4 in=in4.db | cppextract -f , -P NEW_MODEL /stdin Id Date {a,b,b2}{c,d}L {d1,d2,d3,d4}{x,}y | perl -lane '$F[0] = (shift @F) .".$F[0]"; $, = ":"; print @F;' | state2 --id=Id.Date wq.db -'], answer: '{{out}}/utestt.csv', n: 5, cols: [f,k]}
解析后,会产生以下错误:
意外字符($ F [0] =(shift @F)。“。$ F [0]”; $,=“:”;打印@F;'']
此命令
state --m=4 in=in4.db | cppextract -f , -P NEW_MODEL /stdin Id Date {a,b,b2}{c,d}L {d1,d2,d3,d4}{x,}y | perl -lane '$F[0] = (shift @F) .".$F[0]"; $, = ":"; print @F;'
在linux命令行上提供正确的输出,但是在运行yaml时抛出yaml解析器异常。
答案 0 :(得分:0)
首先,让我们以更易读的格式解开YAML文件:
tasks:
test: {
include: [bash_exec],
args:['-c', 'state --m=4 in=in4.db | cppextract -f , -P NEW_MODEL /stdin Id Date {a,b,b2}{c,d}L {d1,d2,d3,d4}{x,}y | perl -lane '$F[0] = (shift @F) .".$F[0]"; $, = ":"; print @F;' | state2 --id=Id.Date wq.db -'],
answer: '{{out}}/utestt.csv', n: 5, cols: [f,k]
}
第一个问题是args:[
; YAML要求您从键中分离映射值(除非键是带引号的标量)。让我们做到这一点:
tasks:
test: {
include: [bash_exec],
args: [
'-c',
'state --m=4 in=in4.db | cppextract -f , -P NEW_MODEL /stdin Id Date {a,b,b2}{c,d}L {d1,d2,d3,d4}{x,}y | perl -lane '
$F[0] = (shift @F) .".$F[0]"; $, = ":"; print @F;' | state2 --id=Id.Date wq.db -'
],
answer: '{{out}}/utestt.csv', n: 5, cols: [f,k]
}
这使发生的情况显而易见:在'state
符号之前,以$
开头的单引号标量结束。由于我们处于YAML流序列(以[
开头)中,因此解析器期望该值之后的逗号或序列的结尾。但是,它找到了它抱怨的$
。
现在,显然,您不想在$
之前停止标量; '
应该是内容的一部分。有多种方法可以实现此目的,但是最易读的方法可能是将值定义为块标量:
tasks:
test:
include: [bash_exec]
args:
- '-c'
- >-
state --m=4 in=in4.db | cppextract -f ,
-P NEW_MODEL /stdin Id Date {a,b,b2}{c,d}L {d1,d2,d3,d4}{x,}y |
perl -lane '$F[0] = (shift @F) .".$F[0]"; $, = ":"; print @F;' |
state2 --id=Id.Date wq.db -
answer:
- '{{out}}/utestt.csv',
- n: 5
- cols: [f, k]
>-
启动一个流标量,它可以跨越多行,并且换行符将折叠为一个空格字符。请注意,我删除了周围的流映射({…}
),并用块映射替换了它,以便能够在其中使用块标量。
我也将answer
更改为当前不存在的序列,但看起来应该是正确的(在您显示的YAML中也是错误的)。