【发布时间】:2023-03-26 14:58:03
【问题描述】:
我是 shell 脚本的新手,非常感谢任何帮助。
我有这样的模式rmd_ver=1.0.10
我想搜索模式 rmd_ver= 并在所有匹配项中将数字部分 1.0.10 替换为新值。希望我的问题很清楚。
【问题讨论】:
我是 shell 脚本的新手,非常感谢任何帮助。
我有这样的模式rmd_ver=1.0.10
我想搜索模式 rmd_ver= 并在所有匹配项中将数字部分 1.0.10 替换为新值。希望我的问题很清楚。
【问题讨论】:
替换任何值直到行尾:
sed -i 's/\(rmd_ver=\)\(.*\)/\1R/' file
sed -i 's/p/r/' file 在 file 中将 p 替换为 r
\(开始第一组rmd_ver= 搜索模式\)结束第一组\(开始第二组.* 任意字符\)第二组结束\1 反向引用第一组R替换文字在行的任何位置替换确切的模式,并且可能在一行中多次替换:
sed -i 's/\(rmd_ver=\)\(1\.0\.10\)/\1R/g' file
\. 转义特殊 . 成文字 .
g 替换一行中的多个匹配项【讨论】:
sed 's/\(rmd_ver=\).*[[:number:]]$/\1NEW_VAL/g'
您可以将 NEW_VAL 替换为您要替换的值。
【讨论】:
[:number:]。也许您的意思是[:digit:],但即使在这种情况下,它也不会按预期工作,因为.* 匹配所有内容,并且该行可以以非数字结尾。 g 在这里也没有效果,因为你替换了整行。
根据您的描述,我认为您只需要替换命令,语法为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
【讨论】:
如果你懒得重复替换中的模式(s/rmd_ver=1\.0\.10/rmd_ver=2.0.0/),请将其存储在一个组中:
sed -e 's/\(rmd_ver=\)1\.0\.10/\12.0.0/'
【讨论】: