我有两个sed
命令,其中包含我的cook.sh
脚本。一个命令是
sed -E -i "s/^(\\\$mainDomain=\")[^\"]+(\";)$/\1$MainDomain\2/" /var/config.php
这很好用。
但是下面的命令几乎是一样的。但它没有用。
sed -E -i "s/^(\\\$authURI=\")[^\"]+(\";)$/\1$duo_auth\2/" /var/config.php
提供以下错误消息
sed:-e expression#1,char 36:`s'
的未知选项
对此有何想法?
答案 0 :(得分:2)
问题可能是由于您的替换变量$duo_auth
具有未转义/
,将默认sed
分隔符从/
更改为~
sed -E -i "s~^(\\\$authURI=\")[^\"]+(\";)$~\1$duo_auth\2~" /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_auth\2~" /var/config.php
<?php
$authURI="http://auth.uri.digin.io:3048/";
答案 1 :(得分:0)
问题是可能是,因为$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
文件。