使用sed -E/-r替换含{和$的字符串时{匹配异常排查
问题原因与解决方法
核心问题是你在sed -r(扩展正则ERE模式)下错误转义了{,导致正则试图匹配\{(反斜杠+左大括号),但原字符串里只有{,因此匹配失败。
sed正则模式的关键规则
sed分两种正则模式,{}的处理逻辑完全不同:
- 基础正则(BRE,默认模式):要使用量词(如指定重复次数),需给
{}加反斜杠(比如a\{2\}匹配2个连续的a);匹配字面{}时,直接写即可,无需转义。 - 扩展正则(ERE,
-r/-E参数):量词无需转义(比如a{2}直接匹配2个连续的a);匹配字面{}时,同样直接写即可——如果转义{写成\{,反而会匹配\+{的组合,这显然不符合你的需求。
修正后的命令
把正则里的:=后的\{改成{即可:
part=5 echo ': "${TARGET_PART:=${MMC_PART2}}"' | sed -r "s/:={(MMC_PART).}}/\1$part}}/g"
执行后会输出预期结果:: "${TARGET_PART:=${MMC_PART5}}"
你第二个命令用.匹配{能生效,是因为.会匹配任意单个字符,刚好命中了{,但这属于巧合,并非正确的匹配方式。
内容的提问来源于stack exchange,提问作者Floyd Brown
相关产品推荐
相关产品推荐

