我有两个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
文件。