我正在尝试从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选择中排除“#”评论?
答案 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}');
这将过滤包含一些空格后跟哈希的每一行。