1

我有以下 CSSbackground-image规则,其中我希望将 URL 替换为新域(你知道,为了通过无 cookie 域加载图像):

  1. background-image : url(/image/test.png);
  2. background-image : url("/image/test.png");
  3. background-image : url('/image/test.png');

我可以先捕获引号/image,然后用以下sed表达式正确替换 URL:

local someVar=123
local replace='url\("\/\/img.mydomain.com\/'"$someVar"'\1\")'
sed -E 's,url\(.(.+).\),'"$replace"',g' file.css

片段

url\(.

处理 URL 字符串中的引号(单引号或双引号)。但是如果引号不存在(上面的第一个例子),正则表达式显然会失败。什么是正确的正则表达式来检查这个?

我尝试了以下方法,但它不起作用:

local someVar=123
local replace='url\("\/\/img.mydomain.com\/'"$someVar"'\1\")'
sed -E 's,url\((\'|\")(.+)(\'|\")\),'"$replace"',g' file.css

它只是抛出错误:syntax error near unexpected token `)'

4

3 回答 3

3

你可以使用这个 sed:

local someVar=123
local replace='\1\2//img.mydomain.com/'"$someVar"'\3\4'

在 Linux 上使用这个 sed 命令:

sed -r "s~(url\()(['\"]?)(.*)$2(\);)~$replace~" file.css

在 OSX 上使用这个 sed 命令:

sed -E "s~(url\()(['\"]?)(.*)$2(\);)~$replace~" file.css

输出:

background-image : url(//img.mydomain.com/123/image/test.png);
background-image : url("//img.mydomain.com/123/image/test.png");
background-image : url('//img.mydomain.com/123/image/test.png');
于 2013-09-02T09:56:34.093 回答
2

根据这个答案(如何在 sed 中匹配单引号),您应该使用另一对单引号:

local someVar=123
local replace='url\("\/\/img.mydomain.com\/'"$someVar"'\1\")'
sed -E 's,url\(('\''|\")(.+)('\''|\")\),'"$replace"',g' file.css

为了更好的可读性,您可以使用方括号代替括号,并且您可以只放双引号而不转义它。

sed -E 's,url\(['\''"]?([^'\'']+)['\''"]?\),'"$replace"',g' file.css
于 2013-09-02T07:43:34.653 回答
1
someVar=123
replace='\/\/img.mydomain.com\/'"$someVar"''
sed  -E 's,(\/.*\/[a-z.]+),'"$replace"'\1,g' file.css

输出:

background-image : url(//img.mydomain.com/image/test.png);
background-image : url("//img.mydomain.com/image/test.png");
background-image : url('//img.mydomain.com/image/test.png');
于 2013-09-02T08:16:10.687 回答