sed命令 - 在find中排除特定模式时查找并替换

时间:2014-07-31 06:53:55

标签: regex unix replace sed find

我有一个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的问题!

非常感谢这个领域的任何帮助!

1 个答案:

答案 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'