Heim > Fragen und Antworten > Hauptteil
Der Originaltext wird wie folgt vereinfacht (mehrere Tabellenerstellungsanweisungen, einige Tabellen haben die gleichen Felder):
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
Ich muss die Tabellenerstellungsanweisungen auswählen, die field2
Felder in der Tabelle haben, also den folgenden Text auswählen
CREATE TABLE `test3` (
`field2` int,
) ENGINE=InnoDB
CREATE TABLE `test5` (
`field2` int,
) ENGINE=InnoDB
Ich dachte an eine reguläre RegelCREATE_.{-}F_class_type_.{-}ENGINE
, aber damit stimmt offensichtlich etwas nicht.
So fügen Sie Einschränkungen hinzu, sodass im ausgewählten Text nur eine CREATE
vorhanden ist, damit der ausgewählte Text korrekt ist. Danke.
Überprüfen Sie es selbst, schauen Sie sich einfach negativ um.
ringa_lee2017-05-16 16:42:06
又查了一下正则,使用否定环视就能解决这个问题。
先贴正确的正则:\vCREATE(\_.(CREATE)@!){-}field2\_.{-}ENGINE.*
解释一下,也方便以后自己查看\v
:任何元字符都不用加反斜杠\_.
:包括换行符的所有字符(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`[\s\S]*?ENGINE=InnoDB