原始文本简化如下(好几个建表语句,有些表中有相同的字段):
CREATE TABLE `test1` (
`field1` int,
) ENGINE=InnoDB
CREATE TABLE `test2` (
`field1` int,
) ENGINE=InnoDB
CREATE TABLE `test3` (
`field2` int,
) ENGINE=InnoDB
CREATE TABLE `test4` (
`field3` int,
) ENGINE=InnoDB
CREATE TABLE `test5` (
`field2` int,
) ENGINE=InnoDB
我需要把表中有field2
字段的建表语句选出来,也就是把下面的文本选出来
CREATE TABLE `test3` (
`field2` int,
) ENGINE=InnoDB
CREATE TABLE `test5` (
`field2` int,
) ENGINE=InnoDB
想到了一个正则CREATE_.{-}F_class_type_.{-}ENGINE
,但这个显然有问题。
怎样加限制条件使选出的文本中只有一个CREATE
,这样选出的就是正确的了。谢谢。
自己又查了查,使用否定环视就可以了。
ringa_lee2017-05-16 16:42:06
又查了一下正则,使用否定环视就能解决这个问题。
先贴正确的正则:vCREATE(_.(CREATE)@!){-}field2_.{-}ENGINE.*
解释一下,也方便以后自己查看v
:任何元字符都不用加反斜杠v
:任何元字符都不用加反斜杠_.
:包括换行符的所有字符(CREATE)@!
:顺序否定环视(_.(CREATE)@!){-}
:非贪婪匹配任意字符,并且匹配出的结果中不含有CREATE
_.
:包括换行符的所有字符
(CREATE)@!
:顺序否定环视(_.(CREATE)@!){-}
:非贪婪匹配任意字符,并且匹配出的结果中不含有CREATE
字符串
漂亮男人2017-05-16 16:42:06
另外的思路: 用 宏
应该也可以
:vim some.sql
/field2
qa{V}:w! >> wanted.sql
nq
99@a
:h {
99@a
中的99
可以通过 %/field2//n
获取世界只因有你2017-05-16 16:42:06
随手写了一个,在sublime中测试通过。供参考:
CREATE TABLE .*s.*`field2`[sS]*?ENGINE=InnoDB