Sed无法正常工作 - Shell脚本

时间:2016-12-30 08:53:27

标签: linux bash shell sed ubuntu-14.04

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

的未知选项

对此有何想法?

2 个答案:

答案 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文件。