如何用SED替换Prisma Schema中的第二个provider值?
问题分析与解决
你的需求是替换schema.prisma中datasource块里的provider值,原正则和sed命令存在几个关键问题:
原正则与命令的问题
sed默认不支持PCRE负向预查
(?!...)是Perl兼容正则(PCRE)的负向预查语法,但sed默认使用基本正则表达式(BRE),会把(、?、!当成普通字符处理,根本无法实现"排除包含prisma的provider行"的逻辑,自然匹配不到目标行。替换范围错误
你的命令s/\bprovider\(?!.*prisma\)/blue/只会替换provider这个单词本身,就算匹配成功,也只会把provider = somevalue改成blue = somevalue,而不是替换整个赋值语句的右侧值。断言逻辑位置错误
就算启用PCRE支持,\bprovider(?!.*prisma)的断言是检查provider紧接的后续内容里没有prisma,但实际上generator块里的provider行是provider = "prisma-client-js",provider后面的内容确实包含prisma,这个断言逻辑本身能区分两行,但因为sed不支持语法而失效。
正确的sed实现方式
方法1:通过块定位精准修改
利用sed的地址范围匹配,先定位到datasource db的代码块,再替换其中的provider行:
sed '/datasource db {/,/}/ s/^\s*provider\s*=\s*.*/provider = "blue"/' ./prisma/schema.prisma
/datasource db {/,/}/:匹配从datasource db {到对应}的整个代码块s/^\s*provider\s*=\s*.*/provider = "blue"/:在块内匹配以任意空格开头的provider赋值行,替换为目标内容
方法2:通过行内容过滤修改
直接排除包含prisma的行(generator里的provider行包含prisma),再替换剩余的provider行:
sed '/prisma/! s/^\s*provider\s*=\s*.*/provider = "blue"/' ./prisma/schema.prisma
/prisma/!:只处理不包含prisma字符串的行- 后续替换逻辑同方法1
内容的提问来源于stack exchange,提问作者Charlie Benger-Stevenson
相关产品推荐
相关产品推荐

