sed 文の編集

sed 文の編集

テキスト変数を使用してFirefoxホームページを動的に変更するスクリプトを作成しています。

sed -i 's|\("browser.startup.homepage",\) "\(.*\)"|\1 "$ddrs"|' /home/max/.mozilla/firefox/*.default/prefs .js

$ddrs単一引用符ステートメント内で変数を拡張する問題を解決する必要がありますsed

答え1

二重引用符などの特殊文字エスケープ処理を減らすには($使うなら)、変数自体を二重引用符で囲み、残りを一重引用符で囲むことができます。その間にスペースはありません。

's|\("browser.startup.homepage",\) "\(.*\)"|\1 '"$ddrs"' |'

また、2番目の値を引用しないので、括弧を使用する理由はありません。

's|\("browser.startup.homepage",\) ".*"|\1 '"$ddrs"' |'

$ddrs同様に、変数の値を二重引用符で表示するにはファイルに編集するときは、次の二重引用符を含める必要があります。

's|\("browser.startup.homepage",\) ".*"|\1 "'"$ddrs"'" |'

しかし、1行に複数の値がある可能性があると思われました(または持つこともできました)、sed正規表現は貪欲なので.*一致します。残りの行最後二重引用符。欲張りにならないようにするには(この特定のユースケースでは)、二重引用符を除くすべての項目に一致する文字クラスを使用してください。

's|\("browser.startup.homepage",\) "[^"]*"|\1 "'"$ddrs"'" |'

そして、誤って一致する可能性はほとんどありませんが、.最初の文字列の点()は点と一致せず、文字クラス「すべての単一文字」と一致します。これを避けるには、次のようにエスケープする必要があります。

's|\("browser\.startup\.homepage",\) "[^"]*"|\1 "'"$ddrs"'" |'

カンマ区切り文字を使用しているように見えますが、2つのスペースまたはゼロ以外のカンマの後の1つのスペースのみが一致します。スペースがいくつかあります。可能したがって、堅牢性のために、カンマと二重引用符の間に任意のスペースを入れてください。

's|\("browser\.startup\.homepage",\) *"[^"]*"|\1 "'"$ddrs"'" |'

ここには他に明らかな問題はありません。 (1) 末尾の空白は意図的なものであると仮定する。 (2)|URL(の内容)に表示されないと仮定すると、かなり安全な文字だと思います$ddrs。ここから脱出するのは読書にやや悪夢ですが、この特定の用途ではsed避けられないと思います。

堅牢性を犠牲にすることなく読みやすさに努力することをお勧めしますが、堅牢性は読みやすさよりも重要です。

答え2

ホームページURLデータベースから任意のページにリダイレクトされる単一のURLにホームページを設定する方が簡単ではありませんか?

これにより、ブラウザを再起動するたびにホームをクリックするたびに(またはホームに移動する新しいタブ/ページを開くたびに)ホームページのランダム化が発生します。また、常にFirefox設定が混乱するのを防ぎます。

これを行う最も簡単な方法は、CGIスクリプトをサポートする場所に最小限のWebサーバーをインストールし、すべての要求に対してURLリダイレクトを発行する簡単なCGIを作成することです。 URLは単純なデータベースから取得されます(テキストファイルであってもファイルは問題ありません)。度))。

答え3

"次のように、すべてのsedパラメータの周りに引用符を使用し、既存の引用符をエスケープします。

sed -i "s|\(\"browser.startup.homepage\",\) \"\(.*\)\"|\1 \"$ddrs\" |" /home/max/.mozilla/firefox/*.default/prefs.js

説明する

sedに渡した元のパラメータは次のとおりです。

's|\("browser.startup.homepage",\) "\(.*\)"|\1 "$ddrs" |'
  • 構文を使用してくださいs|search|replace|
  • ただし、リテラル引用符を使用すると'bash 拡張が防止されるため、Bash 拡張はありません$ddrs$ddrs

このパラメータを次のように変更します。

"s|\(\"browser.startup.homepage\",\) \"\(.*\)\"|\1 \"$ddrs\" |"
  • ただし、引用符を使用しているので、ソースを次のように置き換えてエスケープする必要が"あります。"\"
  • "これで引用符で囲まれたので、 Bash は正常に拡張されます。$ddrs

答え4

私は自分で解決策を見つけました。
行内のターゲット文字列を素敵なものに置き換えるように主張する代わりに、行全体を置き換えることにしました。

  1. urls.txtまず、ファイルをディレクトリに入れました~/.mozilla/firefox/*.default/
  2. その後、ファイルの先頭に次のコードを書きました/usr/lib/firefox/firefox.sh
ddrs=$(shuf -n1 ~/.mozilla/firefox/*.default/urls.txt)
nwli="user_pref(\"browser.startup.homepage\", "$ddrs");"
sed -i "/browser.startup.homepage/c\\$nwli" ~/.mozilla/firefox/*.default/prefs.js

関連情報