如何用sed仅替换{{CODE}}-project而不替换{{CODE}}-project-start?
解决sed替换时误匹配的问题
你遇到的是sed替换时的部分匹配问题——原表达式会命中{{CODE}}-project-start里的前缀部分,导致不该替换的内容被修改。下面是几种可行的解决方式:
针对整行就是目标字符串的场景
给替换表达式加上行尾锚定符$,确保只替换独立一行的{{CODE}}-project:REP="s/{{CODE}}-project$/123-project/" cat schema.yml | sed "$REP"原理:
$代表行的结束位置,只有当{{CODE}}-project刚好是整行内容时才会被替换,不会影响后面带-start的行。适用更广泛场景的完整单词匹配
用GNU sed的单词边界锚定符\<和\>,限定只替换作为完整单词存在的{{CODE}}-project:REP="s/\<{{CODE}}-project\>/123-project/" cat schema.yml | sed "$REP"原理:
\<标记单词的起始,\>标记单词的结束,{{CODE}}-project-start里的前缀后面还有字符,不满足单词结束的条件,因此不会被匹配替换。用负向预查精确排除特定后缀
如果需要灵活排除特定后缀(比如-start),可以借助sed的扩展正则负向预查(需要加-E选项启用扩展正则):REP="s/{{CODE}}-project(?!-start)/123-project/" cat schema.yml | sed -E "$REP"原理:
(?!-start)表示匹配{{CODE}}-project后面不跟着-start的情况,精准跳过不需要修改的行。
内容的提问来源于stack exchange,提问作者LJG
相关产品推荐
相关产品推荐

