如何使用sed/perl/awk查找替换properties文件中ph对应的未知值
你之前的sed命令失效是因为.*属于贪婪匹配规则,会从ph:后的位置一直匹配到整行末尾的最后一个逗号,导致中间的delta:1.0,gamma:.5等内容被误匹配覆盖。
方案1:sed(推荐,兼容性好)
使用否定字符集[^,]*替代贪婪匹配的.*,该规则只会匹配ph:后到下一个逗号前的所有内容,不会越界匹配后续字段。
如果需要限定仅修改allNames开头的行(避免其他行存在相同ph:字段被误改),使用以下命令:
# Linux 环境直接修改原文件 sed -i '/^allNames=/ s/,ph:[^,]*/,ph:0.5/' foo.properties # macOS 环境直接修改原文件 sed -i '' '/^allNames=/ s/,ph:[^,]*/,ph:0.5/' foo.properties # 仅预览修改效果不修改原文件,去掉-i参数即可 sed '/^allNames=/ s/,ph:[^,]*/,ph:0.5/' foo.properties
如果你的场景中ph可能出现在allNames的第一个值位置(比如allNames=ph:0.03,alpha:.02...),可以用更通用的正则兼容该情况:
sed -i '/^allNames=/ s/\([,=]\)ph:[^,]*/\1ph:0.5/' foo.properties
方案2:perl 实现
如果你更习惯perl语法,可以使用非贪婪匹配.*?结合前后向断言实现相同效果,逻辑更简洁:
# 直接修改原文件 perl -i -pe 's/(?<=,ph:).*?(?=,)/0.5/' foo.properties
内容的提问来源于stack exchange,提问作者Java Learner
相关产品推荐
相关产品推荐

