V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
jellyspot
V2EX  ›  程序员

请教下 shell 中,有什么方法,能够快速修改 yaml 中,字段顺序

  •  
  •   jellyspot · 220 天前 · 1013 次点击
    这是一个创建于 220 天前的主题,其中的信息可能已经有所发展或是发生改变。

    yaml 如下

    name1:
    - herry
    - jack
    
    name2:
    - jack
    - herry
    
    name3:
    - jack
    - herry
    

    需求:

    1. 希望把 name2 中的 herry 和 jack 对调下位置,这种有什么好的方式实现吗?
    2. name1 和 name2 的位置整体对调,有没有什么方式实现
    13 条回复    2021-11-24 18:57:02 +08:00
    br_wang
        1
    br_wang  
       220 天前
    不如试下正则替换?
    1. herry -> herry2
    2. jack -> herry
    3. herry2 -> jack
    asilin
        2
    asilin  
       220 天前
    “1”的解决方案:sed -i '/name2:/{n; N; s/\([^\n]\+\)\n\(.*\)/\2\n\1/}' <文件名>
    jellyspot
        3
    jellyspot  
    OP
       220 天前
    @br_wang 但我这里面有多个 name 下都是同样的内容啊,只是顺序不一样,正则貌似没法指定具体字段下的值修改吧
    jellyspot
        4
    jellyspot  
    OP
       220 天前
    @asilin 感谢 我试试
    lanlanye
        5
    lanlanye  
       220 天前
    文件不是特别多或者特别大的话,用 vim 录宏……
    moshiyeap100
        6
    moshiyeap100  
       220 天前
    把 yml 读进来,然后代码里排序,重新生成。
    quanjw
        7
    quanjw  
       220 天前
    dd p
    arischow
        8
    arischow  
       220 天前 via iPhone
    你所熟悉的语言的 yaml 库
    XSG
        9
    XSG  
       220 天前
    可以尝试一个开源小工具 yq
    justrand
        10
    justrand  
       220 天前
    @quanjw 详细说说。没看懂
    quanjw
        11
    quanjw  
       220 天前
    @justrand 抱歉 如果批量操作多个文件应该不行。vi 里面 dd 删除一行,p 粘贴
    zliea
        12
    zliea  
       220 天前
    我觉得应该考虑一下 py ,py 做这种应该比较适合。
    kidonng
        13
    kidonng  
       219 天前 via Android
    取决于这个任务的容错率多高。
    如果目标数据就像你发的那么简单,sed 之类就行。
    如果稍微复杂点的,还是用专门的 YAML 操作工具,TomWright/dasel 或者 9L 提到的 mikefarah/yq 都可以。
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2420 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 06:10 · PVG 14:10 · LAX 23:10 · JFK 02:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.