如何修改sed脚本排除指定依赖,保留其-SNAPSHOT后缀?
修改Sed脚本实现排除指定依赖保留-SNAPSHOT后缀
我来帮你调整这个sed脚本,实现你想要的需求——只移除不含指定关键词的依赖节点里version字段的-SNAPSHOT,而包含关键词的依赖则保留这个后缀。
原脚本的局限
你的原脚本会把<dependencies>块内所有-SNAPSHOT都移除,没办法区分特定依赖,我们需要给sed加一个"条件判断"逻辑,让它只处理符合要求的依赖节点。
调整后的脚本
GNU Sed(Linux环境)
find . -name pom.xml | xargs sed -i ' /<dependencies>/,/<\/dependencies>/{ /<dependency>/{ :process_dep /<\/dependency>/!{ /scheduler/!{ s/-SNAPSHOT// } n b process_dep } } }'
BSD Sed(macOS环境)
macOS的sed语法略有不同,-i参数需要加空字符串:
find . -name pom.xml | xargs sed -i '' ' /<dependencies>/,/<\/dependencies>/{ /<dependency>/{ :process_dep /<\/dependency>/!{ /scheduler/!{ s/-SNAPSHOT// } n b process_dep } } }'
脚本逻辑解释
我把整个逻辑拆成几步,方便你理解:
- 锁定范围:只在
<dependencies>到</dependencies>标签之间的内容里操作 - 定位依赖节点:当遇到
<dependency>开头时,进入循环处理整个依赖块 - 条件替换:在当前依赖块内,逐行检查:
- 如果当前行不包含指定关键词(这里是
scheduler),就执行s/-SNAPSHOT//去掉后缀 - 如果包含关键词,直接跳过替换
- 如果当前行不包含指定关键词(这里是
- 循环到依赖结束:一直处理到
</dependency>标签,再退出当前依赖的处理循环
调整关键词的方法
如果需要更换排除的关键词,只需要把脚本里的/scheduler/!换成你要的关键词即可。比如想排除含oauth的依赖,就改成/oauth/!。
效果验证
用你提供的pom.xml示例测试,运行脚本后:
- 含
scheduler的依赖(比如scheduler-service-core)的version保留了0.0.9-SNAPSHOT - 其他依赖(比如
slf4j-api、oauth10a-client)的version分别变成了1.7.12和0.0.26,完全符合你的预期输出。
内容的提问来源于stack exchange,提问作者Neilyoung Guce
相关产品推荐
相关产品推荐

