求适配sed的<latex>$→$</latex>匹配正则,解决现有正则不兼容问题
适配sed的正则表达式及修正命令
要让sed正确匹配<latex>$\\rightarrow$</latex>这类字符串,需解决shell转义干扰和sed正则特殊字符处理两个核心问题,具体修正如下:
问题根源
原命令失效的关键原因:
zsh双引号环境中,\$会被shell解析为字面$,导致sed实际收到的正则里,$被当作行尾锚点而非目标字符。- echo的字符串未正确转义,zsh会尝试展开
$\\\rightarrow这类“变量名”,输出的原始字符串不符合预期。
修正后的命令及正则
方案一:用单引号隔离shell转义(推荐)
用单引号包裹sed表达式和echo字符串,彻底避免shell解析特殊字符:
echo '<latex>$\\rightarrow$</latex>' | sed -E -e '#<latex>\$([^$]*)\$</latex>#d'
此处sed使用的正则为:#<latex>\$([^$]*)\$</latex>#
#作为正则分隔符(规避原字符串中/的干扰)\$匹配字面美元符号([^$]*)匹配两个$之间的任意非$内容
方案二:双引号内双重转义
若必须使用双引号,需对\和$做双重转义,绕过shell解析:
echo "<latex>\$\\rightarrow\$</latex>" | sed -E -e "#<latex>\\\$([^\\\$]*)\\\$</latex>#d"
该方案中sed实际接收的正则与方案一一致,仅通过转义方式适配双引号环境。
执行任意一种方案,都会返回空字符串,符合预期。
内容的提问来源于stack exchange,提问作者Denis Bitouzé
相关产品推荐
相关产品推荐

