我有一个sed的具体案例。
作为构建过程的一部分,我们需要在多个模块(pom.xml)文件中使用新创建的标记名称查找并替换所需工件的版本号。
我们使用的命令是:
find . -name "*.xml" -print0 | xargs -0 sed -i 's/6\.0\.0\.0/6.0.0.0.001/g'
我们的边缘案例是:
有些模块具有相似的版本号,但已经从我们的存储库中获得了冻结版本。这些不需要改变。
<modulename-version>modulename-6.0.0.0.016</modulename-version>
等条目存在于pom.xml中,但不需要更改。
有没有办法忽略6\.0\.0\.0\.\d{3}
与sed的模式?
整个设置旨在通过我们的远程构建服务器上的python-fabric无人参与运行,我们真的不想在夜间醒来尝试解决未找到模块modulename-6.0.0.0.001.016.jar
的问题!
非常感谢这个领域的任何帮助!
答案 0 :(得分:3)
将您的sed命令更改为:
'/6\.0\.0\.0\.\d{3}/!s/6\.0\.0\.0/6.0.0.0.001/g'
或者
'/6\.0\.0\.0\.\d{3}/b; s/6\.0\.0\.0/6.0.0.0.001/g'
Sed也可能不接受\d
,因此您只能使用[0-9]
:
'/6\.0\.0\.0\.[0-9]{3}/!s/6\.0\.0\.0/6.0.0.0.001/g'
{3}
也可能需要-r
`sed -r ...`
完成命令:
find . -name "*.xml" -print0 | xargs -0 sed -ri '/6\.0\.0\.0\.[0-9]{3}/!s/6\.0\.0\.0/6.0.0.0.001/g'
find . -name "*.xml" -print0 | xargs -0 sed -ri '/6\.0\.0\.0\.[0-9]{3}/b; s/6\.0\.0\.0/6.0.0.0.001/g'