我有一个文件,其中包含一行,我想替换其中的某些内容:
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
这会将其之间//
和紧随其后的所有内容替换:
为您要插入的字符串。