我想用env对HCL块进行排序。
先于
resource "datadog_monitor" "A" {
tags = ["env:stg"]
}
resource "datadog_monitor" "B" {
tags = ["env:dev"]
}后
resource "datadog_monitor" "B" {
tags = ["env:dev"]
}
resource "datadog_monitor" "A" {
tags = ["env:stg"]
}发布于 2022-02-18 17:56:02
通常的方法是将块压缩成单行,对这些行进行排序,然后将这些块展开回原来的形式。假设:缓冲区只包含这些块。
:rangeg/^res/,/^}/s/n/§
说明:
- on each line starting with `res` in `[range]` (`%` by default),
- substitute the EOL `\n` with a fancy character `§`.结果:
资源"datadog_monitor“"A”{§标记= "env:stg"§}§资源"datadog_monitor“{§标记= "env:dev"§}§
*距离/env/
说明:
- sort lines in `[range]` (`%` by default),
- based on what comes after `env`.结果:
资源"datadog_monitor“"B”{§标记=“env:dev”§资源"datadog_monitor“"A”{§标记= "env:stg"§}§
*范围/^res/s/§/\r/g
Explanation:
- on each line starting with `res` in `[range]` (`%` by default),
- substitute every fancy character `§` with the appropriate EOL character.结果:
资源"datadog_monitor“"B”{tag= "env:dev“}资源"datadog_monitor”"A“{tag= "env:stg”}
见:help :range,:help :global,:help :substitute,:help :sort。
发布于 2022-02-18 08:49:13
这可不是小事一桩。Vim排序有用于排序模式的正则表达式。
:'<,'>sort /tags = \["env:/告诉vim忽略"env:上的每件事,然后再排序。但这适用于代码行,而不是块。所以你的代码会被分开。
要在vim中解决这个问题,可以在排序之前将相关的行连接在一起:
:g/tags/norm JkJ这允许以前的那类操作。那么,再一次分割它是微不足道的:
:%s/{/{\r/g
:%s/}/}\r/g但最终,我想肯定会有比vim更好的工具。也许熟悉awk的人能够创造出一个更优雅的解决方案。(可能还有其他的vim解决方案)。
https://stackoverflow.com/questions/71170464
复制相似问题