如何用sed提取配置文件引号内字符串并赋值给bash变量?
问题分析与解决方法
你的sed命令失效大概率是这几个原因:
- 正则没匹配到行内的特殊格式:比如
??=前后的空格、单引号包裹逻辑,或是没处理行首行尾的多余空格 - 未正确展开
${BBPATH}变量:如果脚本里没提前定义BBPATH,或是用单引号包裹sed命令导致变量未被shell解析 - 没控制sed只输出目标内容:sed默认会打印所有行,需要参数配合只输出捕获到的目标值
正确的sed写法示例
先确保BBPATH变量已在脚本中正确定义,再执行以下命令:
MACHINE=$(sed -n "s/^[[:space:]]*MACHINE[[:space:]]*\?\?=[[:space:]]*'\([^']*\)'[[:space:]]*$/\1/p" "${BBPATH}/conf/local.conf")
正则说明:
^[[:space:]]*匹配行首可能存在的空格MACHINE[[:space:]]*\?\?=匹配MACHINE、任意空格及??=(?是正则特殊字符,需转义)[[:space:]]*'\([^']*\)'匹配单引号包裹的内容,并用\1捕获单引号内的字符串[[:space:]]*$匹配行尾可能的空格-n和p配合,只输出匹配并替换后的内容
更简洁的替代方法
如果觉得sed正则过于复杂,也可以用awk实现:
MACHINE=$(awk -F "'" '/^[[:space:]]*MACHINE[[:space:]]*\?\?=/ {print $2}' "${BBPATH}/conf/local.conf")
这里以单引号作为分隔符,匹配目标行后直接提取第二个字段,就是单引号内的目标值。
额外注意事项
- 脚本中可提前增加判断,确保
BBPATH有值:if [ -z "${BBPATH}" ]; then echo "BBPATH未设置"; exit 1; fi - 如果配置文件中
MACHINE的值用双引号包裹,需要对应调整正则或分隔符
内容的提问来源于stack exchange,提问作者void_brain
相关产品推荐
相关产品推荐

