【问题标题】:sed Pattern to Insert Comma after a charactersed 模式在字符后插入逗号
【发布时间】:2021-01-05 00:22:34
【问题描述】:

使用 bash 在结束括号 } 后添加逗号。

使用

sed 's/variable/&,/g;s/,$//'

variable 之后添加逗号,但是,

sed 's/}/&,/g;s/,$//'

没用。

输入:

 variable "policy_name1" {
      description = "abc xyz"
      type        = string
      default = [
        "test1"
        "test2"
      ]
    }
    variable "policy_name2" {
      description = "abc xyz"
      type        = bool
      default     = false
    }

输出:

variable "policy_name1" {
      description = "abc xyz"
      type        = string
      default = [
        "test1"
        "test2"
      ]
    },
    variable "policy_name2" {
      description = "abc xyz"
      type        = bool
      default     = false
    }

【问题讨论】:

  • @F.Hauri 对,我在考虑sed -E/sed -r 的行为!
  • 您已经打开了一个包含相同示例文件的问题,并且您想要解析它并提取值。以防万一您认为必须准备此文件以进行解析(我认为这是个好主意),在此处添加逗号似乎没有帮助。 stackoverflow.com/questions/63948922/…

标签: bash sed


【解决方案1】:

这是你可以做的,

#!/usr/bin/env bash

FILENAME="test.tf"
COUNT=`wc -l $FILENAME | awk '{ print $1 }'`
COUNT=`expr $COUNT - 1`

sed "1,$COUNT s/}/},/" "$FILENAME"

我提供了一个 bash 脚本,以便我们可以以正确的方式避免最后一行。每当找到结束大括号 ( } ) 时,此脚本都会附加一个逗号,除非它是最后一行。

【讨论】:

  • 这行得通,但我不想在最后一行使用 count 变量并且可以添加。我只想在找到结束大括号( } )时附加一个逗号 - 在这种情况下我应该如何修改这个 sed 命令。
  • 然后就用,sed s/}/},/ test.tf
  • 上述命令将简单地将结束大括号(})替换为结束大括号和逗号(},)
【解决方案2】:

大括号后加逗号,但最后一行没有:

sed -e '$!s/^ \{4\}}$/&,/'
  • $!s/ 不在最后一行替换
  • ^ \{4\}}$ 行以 4 个空格开头,然后以 } 结束
  • /&,/ 匹配的内容,然后是 ,

将呈现:

    variable "policy_name1" {
    description = "abc xyz"
        type    = array
        default = [
            "test1"
            "test2"
        ]
    },
    variable "policy_name2" {
    description = "abc xyz"
        type        = bool
        default     = false
    },
    variable "policy_name3" {
    description = "simple test string..."
        type        = int
        default     = 42
    }

更复杂:在每行添加逗号,但不在每个块的最后添加逗号:

sed -e ':a;N;/[^{\[(,] *\n/{/\n[ \o11]*[]})]/!s/\n/,\n/};P;D;$!ba'

可以渲染:

    variable "policy_name1" {
    description = "abc xyz",
        type    = array,
        default = [
            "test1",
            "test2"
        ]
    },
    variable "policy_name2" {
    description = "abc xyz",
        type        = bool,
        default     = false
    },
    variable "policy_name3" {
    description = "simple test string...",
        type        = int,
        default     = 42
    }
  • :a; 标签"a" 用于进一步分支
  • N;与下一行合并
  • /[^{\[(,] *\n/ 如果缓冲区包含逗号或左括号以外的内容,则后跟 换行符
  • { 然后阻止:
    • /\n[ \o11]*[]})]/! 如果 NOT 缓冲区包含换行符,后跟空格,其他则为右括号
    • s/\n/,\n/ 然后在 换行符前加一个逗号
    • };区块结束
  • P; 打印缓冲区到 换行
  • D; 删除缓冲区直到 换行
  • $!ba 如果不在最后一行,则跳转到"a"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-24
    • 1970-01-01
    相关资源
    最近更新 更多