SED正则表达式麻烦

时间:2011-01-31 09:13:20

标签: regex sed

我已经构建了以下正则表达式,以便修复带有无效标记的大型sql转储 这会搜索

\[ame=(?:\\"){0,1}(?:http://){0,1}(http://(?:www.|uk.|fr.|il.|hk.){0,1}youtube.com/watch\?v=([^&,",\\]+))[^\]]*\].+?video\]|\[video\](http://(?:www.|uk.|fr.|il.|hk.){0,1}youtube.com/watch\?v=([^\[,&,\\,"]+))\[/video\]

这取代了

[video=youtube;$2$4]$1$3[/video]

所以这个:

[ame=\"http://www.youtube.com/watch?v=FD5ArmOMisM\"]YouTube - Official Install Of X360FDU![/video]

将成为

[video=youtube;FD5ArmOMisM]http://www.youtube.com/watch?v=FD5ArmOMisM[/video]

它在EditPadPro(Windows)中表现得像一个魅力,但当我尝试在基于Linux的MySQL中导入它时,它会让我与代码页发生冲突。 因此,由于该文件来自Linux安装,我试着用SED运气,但它给了我错误错误。显然,它有一种不同的方式来构建正则表达式。

进行替换非常紧急,所以我没时间阅读SED手册。

您能否将我的正则表达式转换为SED友好格式?

提前Thanx!

更新:我添加了提出的转义字符

\[ame=\(?:\\"\)\{0,1\}\(?:http:\/\/\)\{0,1\}\(http:\/\/\(?:www.|uk.|fr.|il.|hk.\)\{0,1\}youtube.com\/watch\?v=\([^&,",\\]+\))[^\]]*\].+?video\]|\[video\]\(http:\/\/\(?:www.|uk.|fr.|il.|hk.\)\{0,1\}youtube.com\/watch\?v=\([^\[,&,\\,"]+\))\[\/video\]

但我仍然会收到错误 - 未知命令:')'

2 个答案:

答案 0 :(得分:2)

您的正则表达式使用PCRE - Perl兼容正则表达式 - 表示法。正如POSIX所定义的那样(编写了大约1978年的第7版Unix标准化版,这是以前版本的Unix的延续版),sed不支持PCRE。

支持ERE(扩展正则表达式)和BRE(基本正则表达式)的GNU sed版本4.2.1不支持PCRE。

您最好的选择可能是使用Perl为您提供所需的PCRE。如果做不到这一点,请在PCRE支持下使用您选择的脚本语言。

答案 1 :(得分:1)

Sed对你正在使用的正则表达式有一些不同的逃避规则。

  • ()转发\( \) - 进行分组
  • []不是 - 对于角色类
  • {}转发\{ \} - 代表分子

\[ame=\(?:\\"\)\{0,1\}\(?:http:\/\/\)\{0,1\}\(http:\/\/\(?:www.|uk.|fr.|il.|hk.\)\{0,1\}youtube.com\/watch\?v=\([^&,",\\]+\)\)[^\]]*\].+?video\]|\[video\]\(http:\/\/\(?:www.|uk.|fr.|il.|hk.\)\{0,1\}youtube.com\/watch\?v=\([^\[,&,\\,"]+\)\)\[\/video\]

我注意到有几个没有封闭的小组)