代码之家  ›  专栏  ›  技术社区  ›  rluisr

使用特定属性的值对HCL块进行排序

  •  0
  • rluisr  · 技术社区  · 2 年前

    我想对HCL块进行排序 env

    之前

    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"]
    }
    
    0 回复  |  直到 2 年前
        1
  •  1
  •   romainl    2 年前

    通常的方法是将块压缩成单行,对这些行进行排序,然后将块扩展回其原始形式。假设:缓冲区只包含这些块。

    1. 挤压

      :[range]g/^res/.,/^}/s/\n/§
      

      说明:

      • 以开头的每行 res 在里面 [range] ( % 默认情况下),
      • 替换EOL \n 性格奇特 §

      结果:

      resource "datadog_monitor" "A" {§  tags = ["env:stg"]§}§
      resource "datadog_monitor" "B" {§  tags = ["env:dev"]§}§
      
    2. 分类

      :[range]sort /env/
      

      说明:

      • 对行进行排序 [范围] ( % 默认情况下),
      • 基于后面的内容 env

      结果:

      resource "datadog_monitor" "B" {§  tags = ["env:dev"]§}§
      resource "datadog_monitor" "A" {§  tags = ["env:stg"]§}§
      
    3. 取消冻结

      :[range]g/^res/s/§/\r/g
      

      说明:

      • 以开头的每行 res 在里面 [范围] ( % 默认情况下),
      • 代替每一个花哨的角色 § 具有适当的EOL字符。

      结果:

      resource "datadog_monitor" "B" {
        tags = ["env:dev"]
      }
      
      resource "datadog_monitor" "A" {
        tags = ["env:stg"]
      }
      

    看见 :help :range , :help :global , :help :substitute , :help :sort

        2
  •  0
  •   B.G.    2 年前

    这可不是小事。Vim sort有一个用于排序模式的正则表达式。

    :'<,'>sort /tags = \["env:/
    

    确实告诉vim忽略所有 "env: 然后再分类。 但这适用于代码行而非块。所以您的代码将被拆分。

    为了在vim中解决这个问题,可以在排序之前将相关行连接在一起:

    :g/tags/norm JkJ
    

    这允许排序前工作。 然后再次拆分它是微不足道的:

    :%s/{/{\r/g
    :%s/}/}\r/g
    

    但最终,我想一定有比vim更好的工具可以做到这一点。也许有人知道 awk 真的可以创造一个更优雅的解决方案。(可能还有其他vim解决方案)。

    推荐文章