Sed不能正常工作 - Shell脚本
我有两个sed
命令,其中包含我的cook.sh
脚本。一个命令是Sed不能正常工作 - Shell脚本
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表达#1,炭36:未知的选项为`S'
在此任何想法?
问题可能是由于您的更换可变$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/";
工作完美!谢谢@Inian – Daz
问题是可能由于含有$duo_auth
一个UNES狩猎/
。这意味着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
文件。
由于某些原因'@'de-limiter导致了同样的错误,敬畏'〜'似乎很好,而@ @也不是元字符!奇怪! – Inian
@Inian'$ duo_auth'是否包含'@'?如果是这样,是的,它会以同样的方式失败。 – Kusalananda
没有,测试它,即使没有它。 – Inian
提供第二个命令不起作用的示例文件,看起来确定并且变量'$ duo_auth'的值为 – Inian
它可能是'$ duo_auth',其中包含未转义的'/'。你为什么要用'-i'?如果你正在测试的东西,这是一个可怕的方式搞砸了。 – Kusalananda
@Kusalananda感谢事实。你能给我一个解决办法吗? 举一个示例。我对这个sed命令是全新的。 – Daz