编辑 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"' |'

另外,由于您不引用第二个值,因此没有理由为其使用括号:

'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

我自己找到了一个解决方案,
我没有坚持用一些很酷的东西来替换行内的目标字符串,而是选择替换整行,所以:

  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

相关内容