【问题标题】:sed command - find and replace while excluding specific pattern in findsed 命令 - 查找和替换,同时排除查找中的特定模式
【发布时间】:2014-09-23 00:31:41
【问题描述】:

我有一个 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 中,但不需要更改。

有没有办法用 sed 忽略 6\.0\.0\.0\.\d{3} 的模式?

整个设置旨在通过我们的远程构建服务器上的 python-fabric 无人值守地运行,我们真的不想在晚上醒来尝试解决找不到模块 modulename-6.0.0.0.001.016.jar 的问题!

在这个领域的任何帮助将不胜感激!

【问题讨论】:

    标签: regex unix replace sed find


    【解决方案1】:

    将您的 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'
    

    【讨论】:

    • @cruisemaniac 只是想验证一下。您的每行仅包含一个版本字符串,对吗?
    • 到目前为止,是的。 /g 运算符不会处理同一行上的多个替换吗?
    • 好吧,6\.0\.0\.0\.[0-9]{3} 模式会让 sed 跳过处理整行,即使只有一个版本可以匹配它。
    • 啊!我不知道这个。但由于问题中的场景本身就是一个边缘场景,我猜我们将不得不忍受它。而且我必须告诉开发人员重新安排代码库,这样就不会产生你提到的问题!
    猜你喜欢
    • 2012-12-29
    • 2018-10-01
    • 1970-01-01
    • 2017-12-28
    • 2015-04-01
    • 2013-02-09
    • 2014-09-19
    • 2018-10-28
    • 2012-06-07
    相关资源
    最近更新 更多