我有一个很大的 YAML 文件,其中包含有关视频游戏的信息。
---
-
Name: Metal Gear Solid HD Collection
Console: PS3
Genre: Stealth
Progression: Unplayed
Maintenance: Perfect!
-
Name: Metal Gear Solid 4 Guns of the Patriots
Console: PS3
Genre: Stealth
Progression: Unplayed
Maintenance: Perfect!
-
Name: Metal Gear Rising Revengeance
Console: PS3
Genre: Power Fantasy
Progression: Compleat (Blade Wold DLC to play)
Maintenance: Perfect!
-
我正在尝试将大文件拆分为每个游戏一个文件。我找到了一个很好的解决方案,使用:
yq e GameCollection.yaml -s .Name
但这会出现以下错误
Error: cannot index array with 'Name' (strconv.ParseInt: parsing "Name": invalid syntax)
我假设这是因为它试图将 Name 视为字符串,所以我用单引号将其括起来以使其更像字符串。我在这里找到了这个解决方案(在获得最多支持的答案下的评论中),它让我看到了不同的错误消息并解决了这个问题。
yq e GameCollection.yaml -s '.Name'
这给了我一个不同的错误,我认为这是因为名称不是唯一标识符,因为有时多个控制台上有相同的游戏(例如 Skyrim)
Error: bad split document expression: 1:1: invalid input text "'.Name'"
我发现,我认为一个很好的解决方案是添加索引,这样重复的名称就可以增加!我在这里找到了解决方案。
yq e GameCollection.yaml -s '.Name + "_" + $index'
但它给了我类似的错误。
Error: bad split document expression: 1:1: invalid input text "'.Name"
我又试了几次,因为我认为我只是不明白语法。
yq e GameCollection.yaml -s '.Name' + "_" + '$index'
Error: bad split document expression: 1:1: invalid input text "'.Name'"
yq e GameCollection.yaml -s '.Name' + "_" + $index
Error: bad split document expression: 1:1: invalid input text "'.Name'"
yq e GameCollection.yaml -s .Name + "_" + '$index'
Error: cannot index array with 'Name' (strconv.ParseInt: parsing "Name": invalid syntax)
这几乎就像它不喜欢单引号?
有人可以给我指明正确的方向吗?
这个问题与使用引号无关。原因很简单:您的文件包含单元素数组的文档。因此
.Name
顶层没有,但它是每个数组第一个元素的键。因此,您需要像这样指定它:一些背景信息
将您的文件与您查看的另一个问题的文件进行比较。
来自另一个问题:
您的文件:
请注意额外的
-
一行:它很重要。调试该问题的另一种方法是将文件转换为 JSON 格式,有些人认为这种格式更清晰,有助于更明确地显示结构:
请注意所有这些都
[ ... ]
表明这些都是数组。