Regex SED正则表达式的麻烦

Regex SED正则表达式的麻烦,regex,sed,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=([^\[,&,\\,"]+)

为了修复带有无效标记的大型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友好的格式吗

先走一步

更新:我添加了建议的转义字符

\[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\]

但是我仍然得到错误-unknown命令:')'

Sed只是对您正在使用的正则表达式有一些不同的转义规则

  • ()
    转义的
    \(\)
    -用于分组
  • []
    不适用于字符类
  • {}
    为分子转义的
    {\}


我注意到在封闭组上有几个未替换的

您的正则表达式使用了与PCRE-Perl兼容的正则表达式表示法。按照POSIX的定义(
sed
不支持PCRE,它是1978年前后第7版Unix标准化的内容,是Unix以前版本的延续)

即使支持ERE(扩展正则表达式)和BRE(基本正则表达式)的版本4.2.1也不支持PCRE


您最好的选择可能是使用Perl为您提供所需的PCRE。如果没有,请使用您选择的脚本语言并支持PCRE。

您尝试了什么
sed
命令?肯定没有与sed兼容的正则表达式我创建了一个仅包含搜索reg表达式的文件,并执行了sed-f regexpscript.txt mytext.txt。我会犯错误。我用的是我在大学里学的正则表达式。我无法理解SED可能不使用标准拟声学的原因。皮蒂:(
sed
比您年长,@Pytzamarama,多年来一直工作正常。它使用一组特定的正则表达式。由于您没有向我们确切显示您正在使用的文件,也没有显示如何调用它,因此您编写的内容与需要编写的内容之间可能存在各种问题。特别是,如果您有
s/a/b/
,搜索正则表达式和替换正则表达式(a和b)都不包含未转换的斜杠,这一点至关重要。但是,您可以使用任意字符作为分隔符;请尝试^G(control-G)例如,它不会出现在URL中。您也可以使用“%”。您的正则表达式使用PCRE-Perl兼容的正则表达式-表示法。
sed
as标准不支持PCRE.AFAICS,甚至GNU
sed
,后者支持BRE(扩展和基本正则表达式)不支持PCRE。或者只有比我在RHEL 5 Linux上发现的更新版本的GNU sed支持PCRE。(GNU sed 4.2.1不支持PCRE。)欢迎来到regexes.Thanx的奇妙世界,获取您的答案!我做到了(我更新了第一篇文章),但我仍然收到错误“Unknown Command^”,“Unmatched”(或)/('听起来你需要仔细查看你的regexp并确保所有对都是闭合的。你必须转义斜杠字符,比如http:\/\/或者用a替换外部项。\不是所有对都是闭合的,我忽略了你的
'没有被转义。但是,我认为你最好用f来解决这个问题通过调整EditPad的输出,代码页问题比修复正则表达式要简单得多。
\[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\]