我们在Unix / Windows中有一个大文件。 里面的数据就像
update table tblName set col1='Test' where col1='Test1'
select * from a
select * from b
delete from tblName where col1='xyz'
select * from a
select * from b
select * from c
delete from tblName where col1='pqr'
select * from c
我想搜索在VI或Notepad ++和任何其他编辑器中两个或多个select语句在另一个语句之后出现的所有行。
例如
搜索应该找到
select * from a
select * from b
甚至
select * from a
select * from b
select * from c
但不是
select * from c (the last line)
有人可以帮忙吗?
答案 0 :(得分:0)
您应该为此寻找正则表达式。您应该检查文本编辑器使用的标准,然后在文档(Notepad++,vim)中找到。在vim上,您还可以执行:help模式来查找与此相关的文档。在大多数文本编辑器中,此正则表达式应该起作用:
(select \* from \w+\n){2,}
它成功匹配两行或多行形式的
select * from (some variable made up of letters, numbers and underscores)
不匹配
select * from a where property = "foo"
在vim中,情况略有不同,您将不得不使用模式
\(select \* from \w\+\n\)\{2,\}
因此您可以执行替换这些行的操作
:%s/\(select \* from \w\+\n\)\{2,\}/hey, two or more select statements were removed here\r/g
(不过请注意,这些行将在整个文件中被替换,因此请检查您将丢失的内容)。
您可能还需要考虑更多详细信息,例如区分大小写与不区分大小写的搜索以及空行。
答案 1 :(得分:0)
(^select \* from.*\R)(?1)+
. matches newline
说明:
( # start group 1
^ # beginning of line
select \* from # literally
.* # 0 or more any character but newline
\R # any kind of linebreak (ie. \r, \n, \r\n)
) # end group 1
(?1)+ # repeat pattern defined in group 1, 1 or more times