sed 防止删除行的其余部分

Zei*_*zar 2 sed text-processing regular-expression

我有一个包含一行的文件,我想替换它中间的内容:

database.url=jdbc:mysql://my.sql.ip.address:mySqlPort/mySqlDbName?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull
Run Code Online (Sandbox Code Playgroud)

假设我要更改IP地址;我使用了以下sed命令:

sed -i -r 's/(database.url=jdbc:mysql:\/\/).+(:.+)/\1zizi/' myFile
Run Code Online (Sandbox Code Playgroud)

这输出:

database.url=jdbc:mysql://zizi
Run Code Online (Sandbox Code Playgroud)

但我想要:

database.url=jdbc:mysql://zizi:mySqlPort/mySqlDbName?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull
Run Code Online (Sandbox Code Playgroud)

我应该怎么写我的sed?有没有其他命令可以用来更好地获得它?

αғs*_*нιη 5

也只需打印第二个下一个捕获的组\2(我不会修改或增强您的sed

sed -i -r 's/(database.url=jdbc:mysql:\/\/).+(:.+)/\1zizi\2/' myFile
Run Code Online (Sandbox Code Playgroud)

这是仅更改 IP 匹配部分的改进命令。

sed 's/[1-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}/NEWIP/' infile.txt
Run Code Online (Sandbox Code Playgroud)

如果仅对于以 开头的行database.url

sed '/^database\.url/ s/[1-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}/NEWIP/' infile.txt
Run Code Online (Sandbox Code Playgroud)

或者sed能力更强,甚至更短。

sed 's/\([1-9]\)\{1,3\}\(\.[0-9]\{1,3\}\)\{3\}/NEW/'
Run Code Online (Sandbox Code Playgroud)

请注意,这也可以更改和改进以匹配精确的 IP 地址而不是匹配。1.1.1.999作为无效的 IP。