有什么办法可以在2行中一个又一个的找到相似的单词

时间:2019-01-04 12:10:37

标签: unix vim notepad++ vi

我们在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)

有人可以帮忙吗?

2 个答案:

答案 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)

  • Ctrl + F
  • 查找内容:(^select \* from.*\R)(?1)+
  • UNcheck区分大小写
  • 检查环绕
  • 检查正则表达式
  • 取消检查. 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