如何修改sed表达式,确保多次执行不重复添加-fPIC参数?
让sed添加参数的操作具备幂等性(重复执行不重复添加)
你遇到的问题是典型的sed替换缺乏幂等性——每次执行都会重复匹配并添加参数,导致重复项出现。这里有两种可靠的解决方案,分别适用于不同场景:
方案1:基于行内容判断的替换(兼容性更好)
直接检查目标行是否已经包含-fPIC,如果没有再执行添加操作:
sed -i -E '/-fPIC/! s/-D CONSOLELOG/-D CONSOLELOG -fPIC/g' makefile.init
解释:
/-fPIC/!:这是sed的地址匹配条件,意思是仅对不包含-fPIC的行执行后续的替换命令s/-D CONSOLELOG/-D CONSOLELOG -fPIC/g:当行里没有-fPIC时,把所有-D CONSOLELOG替换成带-fPIC的版本-E:启用扩展正则表达式(如果是BSD sed,可能需要用-r,不过大部分现代sed都支持-E)
这个方案逻辑简单,兼容性强,不管-D CONSOLELOG在行中间还是行尾都能正确匹配。
方案2:使用正向否定预查(精准匹配)
如果你希望更精准地只在-D CONSOLELOG后面没有紧跟-fPIC的时候才替换,可以用正则的正向否定预查(需要GNU sed或支持PCRE的sed版本):
sed -i -E 's/-D CONSOLELOG(?! -fPIC)/-D CONSOLELOG -fPIC/g' makefile.init
解释:
(?! -fPIC):这是正向否定预查断言,意思是匹配-D CONSOLELOG后面**不跟着-fPIC**的位置- 这样即使行里已经有
-fPIC,-D CONSOLELOG -fPIC这个组合也不会被匹配到,自然不会重复替换
注意:
如果你的sed版本不支持正向预查(比如某些旧版BSD sed),方案1会更稳妥。
验证效果
不管用哪种方案,第一次执行后会得到预期的:
CFLAGS = -std=c99 -rdynamic -g -Wall -Wno-write-strings -D CONSOLELOG -fPIC
之后无论执行多少次,该行内容都不会再变化,完美解决重复添加的问题。
内容的提问来源于stack exchange,提问作者Zaks
相关产品推荐
相关产品推荐

