Sed 不以通常的方式工作 - 外壳脚本



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

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

这工作正常。

但是下面的命令几乎相同。但它不起作用。

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

给出以下错误消息

sed:-e 表达式 #1,字符 36:未知选项到"s">

对此有任何想法吗?

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

sed -E -i "s~^(\$authURI=")[^"]+(";)$~1$duo_auth2~" /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=")[^"]+(";)$~1$duo_auth2~" /var/config.php
<?php
$authURI="http://auth.uri.digin.io:3048/";

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

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

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

只要确保你选择一个永远不会出现在$duo_auth$authURI中的角色。

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

相反,做稍微麻烦一点的事情

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

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

最新更新