2012-05-30 22 views
0

我有一個bash腳本,其取代了PHP常量,例如define('xxxx',....);與所需的一個。如何修復SED就地更換Mac OS和Ubuntu的發行

由:

sudo sed -E -i "" "s/^(define).*(${2})[\'|\"].*/${3}/g" "$file" 

的問題是,在Ubuntu它失敗後,由於額外的空間。

-i "" 

如果我刪除了該空間,它將在Ubuntu上運行,但不適用於MacOS,例如,給出一個錯誤。

sed: 1: "../config.php ...": invalid command code 

有什麼方法可以使我的這個命令在* nix中和平地工作?

預先感謝您的時間和知識。

+0

謝謝大家快速反應:) – sakhunzai

回答

2
sudo perl -pi -e "s/^(define).*(${2})[\'|\"].*/${3}/g" "$file" 

雖然我懷疑你確實是指['\"]。 sed的

+0

讓我測試一下,它看起來很直接 – sakhunzai

0

在OS X上安裝GNU sed並使用它。

+0

請建議無需額外麻煩的解決方案。一些其他的命令等將跨域使用,謝謝 – sakhunzai

+0

解決方案並不缺乏。每一個都是它自己的麻煩。 –

1

-i選項是GNU方言的一部分。這不是便攜式的。

一種替代方法是使用一個臨時中間文件:

sed ... ${file} > ${file}.tmp && mv ${file}.tmp ${file} 

另一個是用perl代替的sed,as suggested by triplee

+0

OS X'sed'支持'-i',但是在備份擴展方面略有不同。 –

1

爲了進行就地操作和抑制或避免備份文件的創建,可以設置在操作系統上有條件的數組。

[[ $(uname -s) == 'Darwin' ]] && ioption=(-i "") || ioption=(-i) 
sed "${ioption[@]}" "s/^(define).*(${2})['\"].*/${3}/g" "$file" 

使用了一個數組,以便引用的參數和多個選項/參數都可以工作。如果你想增加附加條件,你可以添加更多的數組。

。注意,管是不是一個括號表達式中的交替字符 - 相反,它是從字面上包括在內。所以除非你想要匹配一個管道,否則你應該忽略它。在外部雙引號內部,單引號不需要轉義。

+0

謝謝@丹尼斯威廉姆森,這似乎是另一種方式。但是,tripleee的解決方案看起來很直接。 – sakhunzai