【问题标题】:Excluding '#' comments from a sed selection从 sed 选择中排除“#”注释
【发布时间】:2014-12-25 17:13:12
【问题描述】:

我正在尝试从 yml 文件中获取配置值,但有一行具有相同的值,但被注释掉了。那就是:

...
    #database_name: prod
    database_name: demo
    database_user: root
    database_password: password
...

我正在使用这个 sed/awk 命令获取所有值:

DATABASE_NAME=$(sed -n '/database_name/p' "$CONFIG_PATH" | awk -F' ' '{print $2}');

现在,如果我这样做,我会得到正确的用户名和密码值,但会得到双重名称。

问题是:

如何从我的 sed 选择中排除“#”个 cmets?

【问题讨论】:

  • 如果您正在解析 YAML 文件,那么也许可以考虑使用 YAML 解析器:-/
  • 当然,你知道命令行 yaml 解析器吗?我知道那里有很多工具......

标签: bash awk sed


【解决方案1】:

如果d 之前总是有一个字符,请使用/[^#]database_name/p

如果没有,您可以使用/\(^\|[^#]\)database_name/p

【讨论】:

    【解决方案2】:

    您不妨在整个操作中使用awk

    DATABASE_NAME=$(awk -F' ' '$1!~/^#/ && /database_name/{print $2}' "$CONFIG_PATH")
    

    这将排除所有以# (cmets) 开头的行。

    【讨论】:

    • 如果冒号总是在那里,则只需 $1=="database_name:"{print $2}database_name 对齐。
    • 它是 YAML,所以它应该一直存在。
    • @mimoralea 如果数据库的名称是你想要的并且总是相同的格式,你可以使用 awk、sed、grep 等。但是小心:YAML 格式可能会改变,database_name 可能不在单独的行上(awk、sed 等解决方案中断)。我通常使用PyYaml 来解析 YAML 文件来解析 yaml 文件(perl 也支持)。
    【解决方案3】:

    我认为大括号是 GNU sed 的一项功能(虽然不确定)

    sed -n '/database_name/ {/^[[:blank:]]*#/!p}'
    

    对于匹配“database_name”的行,如果该行不以空格和哈希开头,则打印它。

    【讨论】:

      【解决方案4】:

      我最终使用了@etan-reisner 解决方案。

      这是我在此过程中发现的特定问题的另一种解决方案:

      DATABASE_NAME=$(cat "$CONFIG_PATH" | grep -v '^[[:space:]]*#' | sed -n '/database_host/p' | awk -F' ' '{print $2}');
      

      这将过滤包含一些空格后跟一个哈希的每一行。

      【讨论】:

        【解决方案5】:

        如果文件在行首有空格:

         sed 's/ //g' file.txt | awk '/^(database)/{print}'
        

        【讨论】:

          猜你喜欢
          • 2015-10-29
          • 1970-01-01
          • 2012-08-13
          • 1970-01-01
          • 2013-07-08
          • 1970-01-01
          • 2021-04-26
          • 1970-01-01
          • 2014-11-16
          相关资源
          最近更新 更多