如何将指定sed脚本改写为单行命令?解决括号不匹配报错
解决sed单行命令的
unmatched {报错问题 问题场景
原多行sed脚本(可正常运行):
sed -i "/INTERPRETER_PYTHON_DISTRO_MAP/,/version_added/ { /default/a\ linux:\n '8': \/usr\/local }" base.yaml
尝试改写为单行命令后无法运行,命令如下:
sed -i "/INTERPRETER_PYTHON_DISTRO_MAP/,/version_added/ {/default/a\ linux:\n '8': \/usr\/local}" base.yaml
报错信息:
sed: -e expression #1, char 0: unmatched `{'
问题原因
将多行sed命令压缩为单行时,sed需要明确的命令分隔符。原多行脚本中换行起到了分隔作用,但单行时必须用**分号;**来分隔命令块内的逻辑以及命令块的结束边界,否则sed无法识别{的闭合位置。
正确的单行命令
方案1:添加分号闭合命令块
sed -i "/INTERPRETER_PYTHON_DISTRO_MAP/,/version_added/ {/default/a\ linux:\n '8': \/usr\/local;}" base.yaml
方案2:更兼容的写法(部分sed版本要求{后无空格)
sed -i "/INTERPRETER_PYTHON_DISTRO_MAP/,/version_added/{/default/a\ linux:\n '8': \/usr\/local;}" base.yaml
说明
分号的作用是告诉sed:/default/a\...这个追加命令已经结束,接下来是闭合命令块的}。添加后sed就能正确解析整个命令结构,不会再出现unmatched {的报错。
内容的提问来源于stack exchange,提问作者Jacob
相关产品推荐
相关产品推荐

