2012-06-26 24 views
1

這是針對Apple平臺的。我的最終目標是找到並替換firefox首選項文件「prefs.js」中的一行以關閉更新。我希望能夠在Mac上爲所有帳戶執行此操作,包括用戶模板(未在示例中包含該模板)。到目前爲止,我已經能夠得到所有具有prefs.js文件的路徑列表文件與此:如何使用引號將命令的結果包裝到另一個命令中?

find /Users -name prefs.js 

我再放入變量舊偏好和新的首選項:

oldPref='user_pref("app.update.enabled", false);' 
newPref='user_pref("app.update.enabled", true);' 

然後,我有一個「for循環」與sed命令來替換舊的偏好與新偏好:

for prefs in `find /Users -name prefs.js` 
    do 
    sed "s/$oldPref/$newPref/g" "$prefs" 
done 

我遇到的問題是,「查找」命令與返回的完整路徑笨「應用程序支持」的路徑名稱如下:

/Users/admin/Library/Application Support/Firefox/Profiles/437cwg3d.default/prefs.js 

該命令運行時,我得到這些錯誤:

sed: /Users/admin/Library/Application: No such file or directory 
sed: Support/Firefox/Profiles/437cwg3d.default/prefs.js: No such file or directory 

我假設我不知需要得到「查找」命令將輸出路徑用「sed」命令的引號封裝來正確解析?我在正確的道路上?我試圖將find命令放到sed中來包裝引號,但我無法獲得任何正確的工作。請讓我知道,如果我應該採取不同的方式。謝謝。

回答

2

對於從find輸出的文件列表,您不希望for prefs in ...。有關更糟糕的原因的更完整解釋,請參見Greg's wiki page about parsing ls。如果您可以使用glob匹配文件,那麼您只能在bash中使用for循環,如果要遞歸執行,這很困難。

如果你能擺動它,用find ... -exec ...代替它會更好。也許是這樣的:

find /Users -name prefs.js -exec sed -i.bak -e "s/$oldPref/$newPref/" {} \; 

sed命令行通過find找到的每個文件執行一次。 {}被替換爲文件名。 Sed的-i選項可以讓你在原地運行它,而不需要標準輸入/標準輸出。檢查手冊頁的使用詳情。

+0

謝謝!那就是訣竅。我仍然每天都在學習新的東西。 – russeller

1

(粒鹽的,我在我的Linux經驗的基礎這一點),我認爲不太與SED多做有形成for循環數組的方式做。當查找結果轉換爲數組時,應用程序和支持之間的空間被視爲分隔符。

有幾種方法可以解決這個問題,但最簡單的方法可能是更改IFS變量。 IFS變量是您的命令行解釋程序用於分隔字段的內部變量(more info)。在運行find命令之前,您可以更改環境的IFS變量。

修改從here例如:

#!/bin/bash 
SAVEIFS=$IFS 
IFS=$(echo -en "\n\b") 
for f in `find /Users -name prefs.js` 
do 
    echo "$f" 
done 
# restore $IFS 
IFS=$SAVEIFS 
相關問題