在sed替换命令'/'中遇到错误标记的解决方法

6

在使用sed命令中替换的过程中,我遇到了一个问题。我有一个名为a.txt的文件,我想用另一行替换单独的一行,但是我却得到了上述的错误。

我想要替换的代码:

DOMAIN_LOCAL = "http://127.0.0.1:3000";

我希望它能被替换为任何其他IP,比如以下内容:
DOMAIN_LOCAL = "http://127.1.1.2:3000";

我已尝试过的内容: -
ip=http://127.1.1.2:3000
sed "s/DOMAIN_LOCAL = .*$/DOMAIN_LOCAL = "$ip";/g" a.txt

但是它给我返回以下错误。有人可以帮忙吗?
sed: 1: "s/DOMAIN_LOCAL = .*$/DO ...": bad flag in substitute command: '/'
3个回答

13

你需要使用另一个分隔符。并转义$或使用单引号:

% ip="http://127.1.1.2:3000"
% sed 's~DOMAIN_LOCAL = .*$~DOMAIN_LOCAL = "'"$ip"'";~' a.txt
DOMAIN_LOCAL = http://127.1.1.2:3000;

s替换命令中使用/作为分隔符时,它将在http://中第一个斜杠处终止:

sed 's/DOMAIN_LOCAL = .*$/DOMAIN_LOCAL = http://127.1.1.2:3000;/'
#                                             ^ here

故障:

sed 's~DOMAIN_LOCAL = .*$~DOMAIN_LOCAL = "'"$ip"'";~' a.txt
#   │                                    ││└ Use double quotes to avoid word splitting and
#   │                                    ││  globbing on $ip
#   │                                    │└ Exit single quotes
#   │                                    └ Literal double quotes
#   └ Using single quotes to avoid having to escape special characters

我想要用双引号,类似于 DOMAIN_LOCAL = "http://127.1.1.2:3000"; - DisplayName
基本上发生的事情是每当我使用 '/' 作为分隔符时,它会在找到斜杠后立即停止替换。这正确吗? - DisplayName
@DisplayName 是的,需要注意的一点是变量 $ip 在 sed 命令被调用之前就已经被扩展了。因此,sed 不知道 http:// 中的斜杠是字面上的斜杠而不是分隔符。 - Andreas Louv

3

你可能需要使用其他分隔符,比如"%",而不是"/"。这对我很有效。


这个答案可以通过添加一个示例来改进;我发现这个示例很有用... 所有的 "/" 必须被替换成在链接示例中是 "?" 的字符 https://dev59.com/6nM_5IYBdhLWcg3w3nbz#1186199 - Michael Dimmitt

2

使用 # 替换 / 可以避免这个问题 $ sed 's#find#replace#' file


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接