Sed - 在特定模式之后替换紧接着的下一个字符串/单词

时间:2014-04-02 17:48:28

标签: shell unix sed

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

我有一个像rmd_ver=1.0.10

这样的模式

我想搜索模式rmd_ver=,并在所有匹配项中使用新值替换数字部分1.0.10。希望我的问题很明确。

4 个答案:

答案 0 :(得分:12)

要替换任何值直到行尾:

sed -i 's/\(rmd_ver=\)\(.*\)/\1R/' file
  • sed -i 's/p/r/' filep替换为r
  • 中的file
  • \(启动第一组
  • rmd_ver=搜索模式
  • \)结束第一组
  • \(启动第二组
  • .*任何字符
  • \)结束第二组
  • \1对第一组的反向引用
  • R替换文字

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

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

根据您的描述,我认为您只需要使用语法s/from_regex/to_result/的substitute命令。要匹配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

答案 3 :(得分:1)

sed 's/\(rmd_ver=\).*[[:number:]]$/\1NEW_VAL/g'

您可以使用要替换的值替换NEW_VAL。