sed 防止删除行的其余部分

sed 防止删除行的其余部分

我有一个文件,其中包含一行,我想替换其中的某些内容:

database.url=jdbc:mysql://my.sql.ip.address:mySqlPort/mySqlDbName?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull

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

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

这输出:

database.url=jdbc:mysql://zizi

但我想要:

database.url=jdbc:mysql://zizi:mySqlPort/mySqlDbName?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull

我应该如何写我的sed?我可以使用其他命令来更好地实现此目的吗?

答案1

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

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

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

sed 's/[1-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}/NEWIP/' infile.txt

如果仅适用于以下行开头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

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

sed 's/\([1-9]\)\{1,3\}\(\.[0-9]\{1,3\}\)\{3\}/NEW/'

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

答案2

较短sed方法:

sed 's~\(.*mysql://\)[^:]*~\1zizi~' file

输出:

database.url=jdbc:mysql://zizi:mySqlPort/mySqlDbName?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull

答案3

sed没有任何技巧的简短解决方案:

$ sed 's#//[^:]*#//zizi#' file
database.url=jdbc:mysql://zizi:mySqlPort/mySqlDbName?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull

这会将其之间//和紧随其后的所有内容替换:为您要插入的字符串。

相关内容