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);'

次に、sedコマンドを使用して「forループ」を作成し、古い設定を新しい設定に置き換えます。

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

私が遭遇している問題は、「find」コマンドがパス名に次のような愚かな「ApplicationSupport」を含むフルパスを返すことです。

/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」コマンドを取得する必要があると思いますか?私は正しい道を進んでいますか?引用符をラップするためにfindコマンドをsedにパイプしようとしましたが、正しく機能するものを取得できません。これを別の方法で行う必要があるかどうかを教えてください。ありがとうございました。

4

2 に答える 2

2

for prefs in ...から出力されるファイルのリストに追加したくありませんfind。これがなぜ悪いのかについてのより完全な説明については、lsの解析に関するGregのwikiページを参照してください。globを使用してファイルを照合できる場合にのみ、bashでforループを使用します。これは、再帰的に実行する場合は困難です。

あなたがそれを振ることができれば、find ... -exec ...代わりに使用する方が良いでしょう。おそらく次のようなものです:

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

コマンドラインは、sedによって検出されたファイルごとに1回実行されfindます。は{}ファイル名に置き換えられます。Sedの-iオプションを使用すると、stdin / stdoutを必要とせずに、インプレースで実行できます。使用法の詳細については、マニュアルページを確認してください。

于 2012-06-26T19:47:21.700 に答える
1

(塩の粒:これはLinuxでの経験に基づいています)

sedとは関係がなく、forループ配列の形成方法と関係があると思います。検索結果が配列に変換される場合、アプリケーションとサポートの間のスペースは区切り文字として扱われます。

これを回避する方法はいくつかありますが、おそらく最も簡単なのはIFS変数を変更することです。IFS変数は、コマンドラインインタープリターがフィールドを区切るために使用する内部変数です(詳細)。findコマンドを実行する前に、環境のIFS変数を変更できます。

ここから変更された例:

#!/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
于 2012-06-26T19:53:14.073 に答える