2016-09-05 40 views
2

我有一個Bash腳本,用於引入多個回購以創建項目工作流程的新實例,該實例基於從命令行提供的信息執行一些字符串替換。Bash腳本在ZSH中導致問題的sed用法

一位同事使用ZSH,並且遇到了在腳本中使用sed似乎是因爲問題。具體來說,它似乎是它不處理正則表達式?例如...

# Author Name. 
    if [[ $authorname ]] 
    then 
    sed -i "" "s/Author Name/$authorname/g" "$file" 
    fi 

導致以下錯誤:

sed: can't read "s/Author Name/$authorname/g" : No such file or directory 

我們發現,通過添加-e標誌大多數字符串替換錯誤走的,但他仍然得到了「未找到」錯誤的數量...

sed: can't read : No such file or directory 

有沒有更好的方法來執行Bash和ZSH友好的字符串替換?

回答

1

假設您正在使用GNU sed,它不需要-i ""這樣的模式來編輯像BSD sed這樣的文件。

man sed

-i[SUFFIX], --in-place[=SUFFIX]

您需要刪除之間的空間:

sed -i"" "s/Author Name/$authorname/g" "$file" 

或者因爲你不採取任何備份,簡單地做:

sed -i "s/Author Name/$authorname/g" "$file" 
+0

這將盡管如此,BSD失敗了。在平臺上使用'-i'並不是真正的便攜方式。 – tripleee

+0

另外,'sed -i「」...'完全等同於'sed -i ...'。 '-i「」'在引用移除後與'-i'相同。 – chepner

1

如果你這樣做:

sed -i "" "s/Author Name/$authorname/g" "$file" 

第一個參數""被視爲正則表達式,和其他人的文件,所以你得到的錯誤。

只需刪除命令行中的""即可。

或者,如果你的命令是動態的,你可以這樣做:

sed -i -e "" -e "s/Author Name/$authorname/g" "$file" 

第一正則表達式將被忽略。