从sed选择中排除'#'注释

时间:2014-10-29 20:16:20

标签: bash awk sed

我正在尝试从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选择中排除“#”评论?

5 个答案:

答案 0 :(得分:2)

您也可以使用awk进行整个操作:

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:1)

如果文件在行的开头有空格:

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

答案 4 :(得分:0)

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

以下是我在此过程中遇到的特殊问题的另一种解决方案:

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

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