MySQL查询 - 用表中的特定URL替换任何和所有URL

时间:2013-12-12 23:24:56

标签: mysql bash

我有一张包含大量文字和网址的表格。 我需要拥有格式为http://anything.anything.anything的任何字符串(URL)并将其替换为http://www.google.com 所以任何和所有的URL都被后者替换。

我在线试过,但找不到任何东西。 这应该是一个mysql命令,我可以在某些时间运行以替换任何和所有URL。

2 个答案:

答案 0 :(得分:2)

你想做一个正则表达式替换,它不是MySQL本机函数,尽管之前有过各种各样的问题。

How to do a regular expression replace in MySQL?

如果您不仅限于使用MySQL,那么一个相对干净的方法就是编写一个bash脚本,该脚本会在表中提取包含URL的所有文本字段的列表以及足够的关键信息,在bash中执行RegEx(或者通过Perl或其他一些脚本语言,如果需要),然后更新回MySQL。

答案 1 :(得分:1)

你可以做些事情。意识到这远非最优 - 我可以听到那里的DBA尖叫着在连接条件下做rlike的前景。

所有这些都在sqlfiddle中:http://sqlfiddle.com/#!2/a3ea9/1/0

考虑以下表格和数据:

create table data (
      url varchar(255)
  );

create table repls (
    regex varchar(255),
    repl varchar(255)
  );

insert into data values
   ("http://example.com"),
   ("http://google.com"),
   ("http://stackoverflow.com"),
   ("http://space.stackexchange.com");

insert into repls values
  ('.*ex.*', 'http://www.yahoo.com'),
  ('.*google.*', 'http://www.bing.com'),
  ('.*stack.*', 'http://programmers.stackexchange.com');

你有一张网址表,还有一张正则表和替换表。

然后,用一个简单的'在select语句中查询...

select
  D.url,
  R.repl
from
  data D
  join repls R on (
      D.url rlike R.regex
    )

我们可以获取所有网址及其替换内容。然而,我在那里嵌入了一个陷阱。

使用此数据和查询,它返回5行:

url                                repl
http://www.example.com             http://www.yahoo.com
http://google.com                  http://www.bing.com
http://stackoverflow.com           http://programmers.stackexchange.com
http://space.stackexchange.com     http://www.yahoo.com
http://space.stackexchange.com     http://programmers.stackexchange.com

首先要注意的是,这是一个替代品。在没有任何匹配之前,它不会进行替换。在这种情况下,这是一件好事,因为我们在http://programmers.stackexchange.com规则上触发了.*stack.*无限循环(它也会触发.*ex.*规则,但是#39;不是无限循环,因为那里的替换不包含ex)。

值得注意的是,匹配两行的内容将在那里两次。您需要额外的逻辑来处理规则的优先级。

最后,这是批发替代品。没有花哨的模式匹配组,因此某些网站上的附加路径信息会被移动到替换后的字符串文本中。

它可能会做所有这些事情,但它会涉及更多。

为了完成这项工作,最好将data拉下来,并用能够处理变化的语言对其进行处理。

另一方面,如果您希望使用更新语句进行批量替换数据(而不是将其拉下来并重新发布相关的更新语句),或者数据移动到的系统是更多比上面的例子更麻烦且容易出错,这可能是一种调查方法。