2012-06-26 25 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 
相关问题