2017-08-16 72 views
-1

我有一個小腳本,可以在各種文件中執行一些global字符串替換。這應該使用sed完成,以便只更改受影響的行。sed不能像預期的那樣在腳本中使用變量

準備:

#!/bin/sh 
find="Mücke Motorsport" 
replace="Mücke Motorsport Racing Team" 
file="/Users/meyer/Dropbox/Dev/App Framework iOS/dev/myfile.txt" 

這是我的腳本問題的行:

sed -i s/"$find"/"$replace"/g "$file" 

無效(sed: 1: "/Users/meyer/Dropb ...": invalid command code o)。下一步嘗試:

sed -i 's/'"$find"'/'"$replace"'/g' "$file" 

無效(sed: 1: "/Users/meyer/Dropb ...": invalid command code o)。下一次嘗試:

sed -i "s/$find/$replace/g" "$file" 

不起作用(sed: 1: "/Users/meyer/Dropb ...": invalid command code o)。下一次嘗試:

sed -i s/$find/$replace/g "$file" 

不起作用(sed: 1: "Motorsport/Mücke": invalid command code M)。由於此錯誤消息的我試圖逃跑我的變量:

escaped_ find =$(printf '%s\n' "$find" | sed 's:[][\/.^$*]:\\&:g') 
escaped_ replace =$(printf '%s\n' "$replace" | sed 's:[\/&]:\\&:g;$!s/$/\\/') 

的替代變量簡化版,工作,但使用...我不知道如何得到這個工作:(

+0

你使用哪個操作系統? –

+0

這可能是一個編碼問題?看到這篇文章:https://stackoverflow.com/questions/67410/why-does-sed-fail-with-international-characters-and-how-to-fix。 'sed -i「s/$ find/$ replace/g」「$ file」'適用於我。 – piarston

+0

@YuriyZhigulskiy我使用的Mac OS(10.11埃爾卡皮坦) –

回答

2

在sed的OSX版本,-i選項希望擴展參數,所以你的命令實際上是解析爲擴展參數和文件路徑被解釋爲命令代碼。

嘗試添加-e參數明確
sed -i'' -e 's/old/new/g' file

+0

就是這樣!謝謝! –

相關問題