This is for the Apple platform. My end goal is to do a find and replace for a line inside of the firefox preference file “prefs.js” to turn off updates. I want to be able to do this for all accounts on the Mac, including the user template (didn’t include that in the examples). So far I’ve been able to get a list of all the paths that have the prefs.js file with this:
find /Users -name prefs.js
I then put the old preference and new preference in variables:
oldPref='user_pref("app.update.enabled", false);'
newPref='user_pref("app.update.enabled", true);'
I then have a “for loop” with the sed command to replace the old preference with the new preference:
for prefs in `find /Users -name prefs.js`
do
sed "s/$oldPref/$newPref/g" "$prefs"
done
The problem I’m running into is that the “find” command returns the full paths with the stupid “Application Support” in the path name like this:
/Users/admin/Library/Application Support/Firefox/Profiles/437cwg3d.default/prefs.js
When the command runs, I get these errors:
sed: /Users/admin/Library/Application: No such file or directory
sed: Support/Firefox/Profiles/437cwg3d.default/prefs.js: No such file or directory
I’m assuming that I somehow need to get the “find” command to wrap the outputted path in quotes for the “sed” command to parse it correctly? I’m I on the right path? I’ve tried to pipe the find command into sed to wrap quotes, but I can’t get anything to work correctly. Please let me know if I should go about this differently. Thank you.
You don’t want to
for prefs in ...on a list of files that are output fromfind. For a more complete explanation of why this is bad, see Greg’s wiki page about parsing ls. You would only use a for loop in bash if you could match the files using a glob, which is difficult if you want to do it recursively.It would be better, if you can swing it, to use
find ... -exec ...instead. Perhaps something like:The
sedcommand line is executed once for each file found byfind. The{}gets replaced with the filename. Sed’s-ioption lets you run it in-place, rather than requiring stdin/stdout. Check the man page for usage details.