我是shell脚本的新手,非常感谢任何帮助。
我有一个像rmd_ver=1.0.10
我想搜索模式rmd_ver=
,并在所有匹配项中使用新值替换数字部分1.0.10
。希望我的问题很明确。
答案 0 :(得分:12)
要替换任何值直到行尾:
sed -i 's/\(rmd_ver=\)\(.*\)/\1R/' file
sed -i 's/p/r/' file
将p
替换为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。