2016-12-30 188 views
1

我有两个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'

在此任何想法?

+0

提供第二个命令不起作用的示例文件,看起来确定并且变量'$ duo_auth'的值为 – Inian

+0

它可能是'$ duo_auth',其中包含未转义的'/'。你为什么要用'-i'?如果你正在测试的东西,这是一个可怕的方式搞砸了。 – Kusalananda

+0

@Kusalananda感谢事实。你能给我一个解决办法吗? 举一个示例。我对这个sed命令是全新的。 – Daz

回答

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/"; 
+0

工作完美!谢谢@Inian – Daz

0

问题是可能由于含有$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文件。

+0

由于某些原因'@'de-limiter导致了同样的错误,敬畏'〜'似乎很好,而@ @也不是元字符!奇怪! – Inian

+0

@Inian'$ duo_auth'是否包含'@'?如果是这样,是的,它会以同样的方式失败。 – Kusalananda

+0

没有,测试它,即使没有它。 – Inian