Regex 不使用';我不能和sed一起工作
对不起,如果标题不够描述性,但我真的不知道如何总结它,欢迎任何建议。我编写了一段有用的正则表达式,用于匹配sql文件中的行,这些行将数据插入特定的表(包含缓存)。事情是这样的:Regex 不使用';我不能和sed一起工作,regex,bash,sed,Regex,Bash,Sed,对不起,如果标题不够描述性,但我真的不知道如何总结它,欢迎任何建议。我编写了一段有用的正则表达式,用于匹配sql文件中的行,这些行将数据插入特定的表(包含缓存)。事情是这样的: (--\s--\sDumping\sdata\sfor\stable\s`(cache_\w+|cache)`.*?)(?=(--\n--.+Table\sstructure\sfor\stable\s`.+`.*--)) -- -- Table structure for table `cache_content`
(--\s--\sDumping\sdata\sfor\stable\s`(cache_\w+|cache)`.*?)(?=(--\n--.+Table\sstructure\sfor\stable\s`.+`.*--))
--
-- Table structure for table `cache_content`
--
something
--
-- Dumping data for table `cache_content`
--
INSERT INTO `cache_content` etc.
--
-- Table structure for table `cache`
--
something
--
-- Dumping data for table `cache`
--
INSERT INTO `cache` etc.
--
-- Table structure for table `notcache`
--
something
--
-- Dumping data for table `notcache`
--
所以现在当我有这样的文件:
(--\s--\sDumping\sdata\sfor\stable\s`(cache_\w+|cache)`.*?)(?=(--\n--.+Table\sstructure\sfor\stable\s`.+`.*--))
--
-- Table structure for table `cache_content`
--
something
--
-- Dumping data for table `cache_content`
--
INSERT INTO `cache_content` etc.
--
-- Table structure for table `cache`
--
something
--
-- Dumping data for table `cache`
--
INSERT INTO `cache` etc.
--
-- Table structure for table `notcache`
--
something
--
-- Dumping data for table `notcache`
--
它将所有插入匹配到这些表中,我想通过使用sed
删除它们(因为这些是带缓存的表),具体来说,我编写了一个简单的bash脚本来实现这一点:
REGEX="(--\s--\sDumping\sdata\sfor\stable\s\`(cache_\w+|cache)\`.*?)(?=(--\n--.+Table\sstructure\sfor\stable\s\`.+\`.*--))"
sed -i "s/${REGEX}//g" $1
现在的问题是,它在我的正则表达式测试仪中工作,但在sed
中根本不工作<代码>sed根本不改变文件,我很兴奋。我在某个地方读到,sed
是基于行的,但这可能是问题所在,还是其他原因
增加#1:
如果无法使用
sed
完成,那么什么是好的替代方案?像这样的sed可以吗?请尝试使用perl代替sed:
perl -e 'undef $/; $_ = <>; s/YOUR_REGEX_HERE//gs; print' $1
perl-e'undef$/;$=;这里是你的正则表达式//gs;打印“$1”
不,您不能使用sed
,因为它是面向行的,并且您的模式必须跨多行匹配。(您可以将模式分为开始模式和结束模式,然后尝试使用/start\u pattern/,/end\u pattern/p
,但是您需要为每个表分别使用开始模式
,因为sed
中的行范围在输入中只能匹配一次。)
您应该能够在awk
中采用简化的开始模式/结束模式方法:
awk 'BEGIN { x = 1 }; /^-- Dumping data for table `cache(_[a-zA-Z0-9]+)?`$/ { x = 0 }; /^-- Table structure for table `[^`]+`$/{ x = 1 }; (x == 1) { print }' $1
或者,您仍然可以使用“真正的”脚本语言对整个文件方法使用一个ginormous regexp(稍作修改):
ruby -e 'File.write(ARGV[0],File.read(ARGV[0]).gsub(/(--\s--\sDumping\sdata\sfor\stable\s`(?:cache_\w+|cache)`.*?)(?=(?:--\n--\s+Table\sstructure\sfor\stable\s`[^`]+`\s*\n--))/m,""))' $1
如果一开始就可以避免,为什么还要创建额外的工作呢?:) 只是不要为您不感兴趣的表生成语句。例如,如果您正在使用MySQL:
mysqldump --ignore-table=<...> --ignore-table=<...>
mysqldump--ignore table=--ignore table=
其他数据库也会有类似的选项。将所有内容都保存在缓冲区中,以便启动sed
sed "H
$ {
x
# your code here
}
请小心,^和$是文件的第一个和最后一个字符,不再有由\n分隔的行。
sed
是基于行的,这是您的问题之一,在正则表达式中使用\s
和\w
可能会很困难。您可能想考虑使用Perl或其他脚本语言来代替BASH/SED。您也使用了LokHead,SeD不支持。谢谢您的建议,但这不是我的转储:)。有时候有人可以用默认的方式发送给我他的数据库转储,这样的脚本就很方便了?如果能成功我会很高兴的。你说得对,我的错,谢谢。我已经更正了答案,请参见上文。这个Ruby代码匹配字符串很好,但是如何从文件中删除匹配项呢?请加上这个好吗?不幸的是,我不懂Ruby,这段代码也可能对其他人有用。经过编辑,Ruby示例现在可以在位编辑该文件。(另外,这两个示例现在都删除了缓存表内容,而不是保留它们并删除所有其他内容!)这是一个非常方便的多行正则表达式替换片段:)。它鼓励我在bash之上学习Ruby或Python。非常感谢你!