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

2021-11-23 17:22:00 +08:00
 jellyspot

yaml 如下

name1:
- herry
- jack

name2:
- jack
- herry

name3:
- jack
- herry

需求:

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