我想用另一个字符串替换一个字符串。例如:我想更改以下文本:
"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
将替换所有出现的53
with40
(但仅在匹配的行中)
输出示例:
$ 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
更好。