Sed 无法正常工作 - Shell 脚本

Sed not working in usual way - Shell scripting

我的 cook.sh 脚本中包含两个 sed 命令。一个命令是

sed -E -i "s/^(\$mainDomain=\")[^\"]+(\";)$/$MainDomain/" /var/config.php

这工作正常。

但是下面的命令几乎是一样的。但它不起作用。

sed -E -i "s/^(\$authURI=\")[^\"]+(\";)$/$duo_auth/" /var/config.php

给出以下错误信息

sed: -e expression #1, char 36: unknown option to `s'

对此有什么想法吗?

问题可能是由于您的替换变量 $duo_auth 具有未转义的 /,请将默认 sed 分隔符从 / 更改为 ~ 作为

sed -E -i "s~^(\$authURI=\")[^\"]+(\";)$~$duo_auth~" /var/config.php

不用-i试一下,看看替换的是否符合预期,确认后再放回去

示例:-

cat /var/config.php
<?php
$authURI="dev.digin.io";

现在设置变量

duo_auth="http://auth.uri.digin.io:3048/"

现在更换,不用-i

sed -E "s~^(\$authURI=\")[^\"]+(\";)$~$duo_auth~" /var/config.php
<?php
$authURI="http://auth.uri.digin.io:3048/";

问题是可能 由于$duo_auth 包含未转义的/。这意味着 sed 编辑脚本会出现语法错误。

您可以选择任何其他字符作为 s/.../.../ 命令中的分隔符,例如 #:

sed "s#....#....#"

只需确保您选择的角色永远不会出现在 $duo_auth$authURI 中。

在测试时,我建议您避免对 sed 使用就地编辑 (-i)。此外,-i 开关在 sed 实现之间非常不可移植(有些需要参数)。

反而稍微麻烦一点

sed -e "s#...#...#" data.in >data.in.tmp && mv -f data.in.tmp data.in

测试时,请在移动前检查 data.in.tmp 文件。