我正在编写一个脚本来通过文本变量动态更改 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"' |'
另外,由于您不引用第二个值,因此没有理由为其使用括号:
's|\("browser.startup.homepage",\) ".*"|\1 '"$ddrs"' |'
同样,如果您希望变量值$ddrs
出现在双引号中在文件中您正在编辑时,需要包含这些双引号:
's|\("browser.startup.homepage",\) ".*"|\1 "'"$ddrs"'" |'
但是,我突然想到,您可能在一行上有多个值(或者您可以有。)由于 sed 正则表达式是贪婪的,因此您.*
将匹配该行的其余部分至最后的双引号。为了使其非贪婪(对于此特定用例),请使用与双引号以外的任何内容匹配的字符类:
's|\("browser.startup.homepage",\) "[^"]*"|\1 "'"$ddrs"'" |'
而且,尽管不太可能发生意外匹配,但.
第一个字符串中的点 ( ) 并不匹配点,而是匹配字符类“任何单个字符”。为了避免这种情况,你要逃避它们:
's|\("browser\.startup\.homepage",\) "[^"]*"|\1 "'"$ddrs"'" |'
看起来您正在使用逗号分隔符,但您仅在逗号后匹配一个空格,而不是两个空格或零。我怀疑有任意数量的空格可能的,因此为了稳健性,请在逗号和双引号之间允许任意空格:
's|\("browser\.startup\.homepage",\) *"[^"]*"|\1 "'"$ddrs"'" |'
这里没有其他明显的问题。 (1) 我假设尾随空格是故意的; (2) 我认为|
这是一个相当安全的字符,假设不会出现在 URL 中( 的内容$ddrs
)。这里的转义读起来有点噩梦,但对于这个特定的用途,sed
我认为这是不可避免的。
稳健性比可读性更重要,尽管在不牺牲稳健性的情况下争取可读性是件好事。
答案2
将主页设置为单个 URL,该 URL 从主页 URL 数据库返回到随机页面的重定向不是更简单吗?
这样,每次您单击“主页”(或打开一个转到“主页”的新选项卡/页面)时,都会发生主页随机化,而不是每次重新启动浏览器时。它还可以避免一直弄乱您的 Firefox 配置。
要做到这一点,最简单的方法是在支持 CGI 脚本的地方安装一个简约的 Web 服务器,并编写一个简单的 CGI,对每个请求发出 URL 重定向,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 扩展$ddrs
,这就是为什么$ddrs
没有 Bash 扩展
我们简单地将这个参数修改为:
"s|\(\"browser.startup.homepage\",\) \"\(.*\)\"|\1 \"$ddrs\" |"
- 然而,由于我们使用
"
引号,我们需要"
通过将其替换为来转义原始的\"
- 由于现在仅用
"
引号括起来,Bash 将成功扩展$ddrs
答案4
我自己找到了一个解决方案,
我没有坚持用一些很酷的东西来替换行内的目标字符串,而是选择替换整行,所以:
- 首先,我将
urls.txt
文件放入目录中~/.mozilla/firefox/*.default/
。 - 然后我在文件的开头编写了以下代码
/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