【问题标题】:Sed - Replace immediate next string/word coming after a particular patternSed - 替换特定模式之后的下一个字符串/单词
【发布时间】:2023-03-26 14:58:03
【问题描述】:

我是 shell 脚本的新手,非常感谢任何帮助。

我有这样的模式rmd_ver=1.0.10

我想搜索模式 rmd_ver= 并在所有匹配项中将数字部分 1.0.10 替换为新值。希望我的问题很清楚。

【问题讨论】:

    标签: shell unix sed


    【解决方案1】:

    替换任何值直到行尾:

    sed -i 's/\(rmd_ver=\)\(.*\)/\1R/' file
    
    • sed -i 's/p/r/' filefile 中将 p 替换为 r
    • \(开始第一组
    • rmd_ver= 搜索模式
    • \)结束第一组
    • \(开始第二组
    • .* 任意字符
    • \)第二组结束
    • \1 反向引用第一组
    • R替换文字

    在行的任何位置替换确切的模式,并且可能在一行中多次替换:

    sed -i 's/\(rmd_ver=\)\(1\.0\.10\)/\1R/g' file
    
    • \. 转义特殊 . 成文字 .
    • g 替换一行中的多个匹配项

    【讨论】:

    • 这是一个很好的答案,因为它实际上解释了每个正则表达式模式。
    【解决方案2】:
    sed 's/\(rmd_ver=\).*[[:number:]]$/\1NEW_VAL/g'
    

    您可以将 NEW_VAL 替换为您要替换的值。

    【讨论】:

    • 这不起作用,因为没有类[:number:]。也许您的意思是[:digit:],但即使在这种情况下,它也不会按预期工作,因为.* 匹配所有内容,并且该行可以以非数字结尾。 g 在这里也没有效果,因为你替换了整行。
    【解决方案3】:

    根据您的描述,我认为您只需要替换命令,语法为s/from_regex/to_result/。要匹配1.0.10 之类的数字,您可以匹配重复的数字或点,例如[0-9.]。这是一个有点简单的正则表达式,它允许在开头和开头有一个点,但让我们从那个开始。那么你的 sed 命令就变成了

    sed 's/rmd_ver=[0-9.]\+/rmd_ver=42/' filename
    

    + 是重复运算符,由于 sed 使用 BRE(基本正则表达式)语法,因此必须对其进行转义。

    如果您想避免在末端​​匹配点,例如1.2.3.,您必须将正则表达式更改为[0-9][0-9.]\+[0-9],以确保第一个和最后一个字符不是点。也许您还希望能够匹配单个数字,那么您必须添加一个替代项(例如 /a|b/ 匹配 a 或 b)来匹配:

    sed 's/rmd_ver=\([0-9][0-9.]\+[0-9]\|[0-9]\)/rmd_ver=42/' filename
    

    【讨论】:

      【解决方案4】:

      如果你懒得重复替换中的模式(s/rmd_ver=1\.0\.10/rmd_ver=2.0.0/),请将其存储在一个组中:

      sed -e 's/\(rmd_ver=\)1\.0\.10/\12.0.0/'
      

      【讨论】:

        猜你喜欢
        • 2019-07-26
        • 1970-01-01
        • 1970-01-01
        • 2021-06-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-27
        • 1970-01-01
        相关资源
        最近更新 更多