将文本替换为另一个文本

将文本替换为另一个文本

我想用另一个字符串替换一个字符串。例如:我想更改以下文本:

"listen_addresses = ['127.0.0.1:53', '[::1]:53']"

到以下文本

"listen_addresses = ['127.0.0.1:40', '[::1]:40']"

我尝试了这个命令:

sudo sed "s#listen_addresses \= \['127\.0\.0\.1\:53'\, '\[\:\:1\]\:53'\]'#listen_addresses \= \['127\.0\.0\.1\:40'\, '\[\:\:1\]\:40'\]#g"

我得到了这个结果:

输入listen_addresses = ['127.0.0.1:53', '[::1]:53']

输出listen_addresses = ['127.0.0.1:53', '[::1]:53']

我究竟做错了什么?

答案1

正如评论中所解释的,只有[]才会被转义

echo "listen_addresses = ['127.0.0.1:53', '[::1]:53']" |
sed -e "s#listen_addresses = \['127.0.0.1:53', '\[::1\]:53'#listen_addresses = ['127.0.0.1:40', '[::1]:40'#"

这给了

listen_addresses = ['127.0.0.1:40', '[::1]:40']

答案2

你可以做:

sed "/^listen_addresses = \['127\.0\.0\.1:53', '\[::1\]:53'\]$/s/53/40/g" file

  • 搜索精确的细绳listen_addresses = ['127.0.0.1:53', '[::1]:53']
  • 如果字符串匹配s/53/40/g将替换所有出现的53with 40(但仅在匹配的行中)

输出示例:

$ cat file
listen_addresses = ['127.0.0.1:53', '[::1]:53']
listen_addresses = ['127.0.0.2:53', '[::1]:53']

$ sed "/^listen_addresses = \['127\.0\.0\.1:53', '\[::1\]:53'\]$/s/53/40/g" file
listen_addresses = ['127.0.0.1:40', '[::1]:40']
listen_addresses = ['127.0.0.2:53', '[::1]:53']

如您所见,需要完全匹配才能执行替换。

答案3

sed s/":53'"/":40'"/g <<<"listen_addresses = ['127.0.0.1:53', '[::1]:53']"

做一些接近你要求的事情。但我同意@Jeff Schaller 的评论!

从你的问题来看,没有人能认识到你为什么不直接用手做?你的台词来自于什么文本,它们之间有何不同?正则表达式应该涵盖哪些变体?

sed适合替换,但对于选择 coresct 线grep更好。

相关内容