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

2021 年 11 月 23 日
 jellyspot

yaml 如下

name1:
- herry
- jack

name2:
- jack
- herry

name3:
- jack
- herry

需求:

  1. 希望把 name2 中的 herry 和 jack 对调下位置,这种有什么好的方式实现吗?
  2. name1 和 name2 的位置整体对调,有没有什么方式实现
2633 次点击
所在节点    程序员
13 条回复
br_wang
2021 年 11 月 23 日
不如试下正则替换?
1. herry -> herry2
2. jack -> herry
3. herry2 -> jack
asilin
2021 年 11 月 23 日
“1”的解决方案:sed -i '/name2:/{n; N; s/\([^\n]\+\)\n\(.*\)/\2\n\1/}' <文件名>
jellyspot
2021 年 11 月 23 日
@br_wang 但我这里面有多个 name 下都是同样的内容啊,只是顺序不一样,正则貌似没法指定具体字段下的值修改吧
jellyspot
2021 年 11 月 23 日
@asilin 感谢 我试试
lanlanye
2021 年 11 月 23 日
文件不是特别多或者特别大的话,用 vim 录宏……
moshiyeap100
2021 年 11 月 23 日
把 yml 读进来,然后代码里排序,重新生成。
quanjw
2021 年 11 月 23 日
dd p
arischow
2021 年 11 月 23 日
你所熟悉的语言的 yaml 库
XSG
2021 年 11 月 23 日
可以尝试一个开源小工具 yq
yEhwG10ZJa83067x
2021 年 11 月 24 日
@quanjw 详细说说。没看懂
quanjw
2021 年 11 月 24 日
@justrand 抱歉 如果批量操作多个文件应该不行。vi 里面 dd 删除一行,p 粘贴
zliea
2021 年 11 月 24 日
我觉得应该考虑一下 py ,py 做这种应该比较适合。
kidonng
2021 年 11 月 24 日
取决于这个任务的容错率多高。
如果目标数据就像你发的那么简单,sed 之类就行。
如果稍微复杂点的,还是用专门的 YAML 操作工具,TomWright/dasel 或者 9L 提到的 mikefarah/yq 都可以。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/817462

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX