2016-12-30 142 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