Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何让Vim匹配不以七位数开头的行?_Regex_Vim - Fatal编程技术网

Regex 如何让Vim匹配不以七位数开头的行?

Regex 如何让Vim匹配不以七位数开头的行?,regex,vim,Regex,Vim,我有一个大约1000行的文件。除偶发行外,所有行均以七位数字开头。我需要捕捉这些线,并将它们与前一行连接起来 通过使用以下正则表达式模式,我成功地匹配了以七位数开头的任何行: ^\d\{7} 我似乎无法让它匹配任何不匹配此模式的线条,这才是我真正想要的 作为第二个问题,我将把它嵌入其中。是否可以让任何匹配(或不匹配以保持与我尝试执行的操作一致)的行连接到上一行(而不是将下一行添加到当前行的J命令) 谢谢 这是vim用于负前瞻的正则表达式语法 如果您以mass:命令的形式执行此操作,您应该能够

我有一个大约1000行的文件。除偶发行外,所有行均以七位数字开头。我需要捕捉这些线,并将它们与前一行连接起来

通过使用以下正则表达式模式,我成功地匹配了以七位数开头的任何行:

^\d\{7}
我似乎无法让它匹配任何不匹配此模式的线条,这才是我真正想要的

作为第二个问题,我将把它嵌入其中。是否可以让任何匹配(或不匹配以保持与我尝试执行的操作一致)的行连接到上一行(而不是将下一行添加到当前行的J命令)

谢谢

这是vim用于负前瞻的正则表达式语法

如果您以mass
命令的形式执行此操作,您应该能够

:v/^\d\{7}/-1j
regexp

^\(\d\{7}\)\@!
将反转原始表达式。有关此语法的详细信息,请参见此处:

:help \@!
至于第二个问题,例如,您可以将前几行的尾随换行符替换为空:

:%s/$\n^\(\d\{7}\)\@!//g

以下是我使用awk的解决方案,可在vim内部调用:

$ cat seven.awk
# Script to join lines that does not start with 7 digits
/^[0-9][0-9][0-9][0-9][0-9][0-9][0-9]/ { print; next }
{ printf $0; getline; print }

$ cat seven.txt
123
4579 bad
7654321 This line is OK
1234567 OK So is this
111
2222 bad again
4443333 OK again

$ awk -f seven.awk seven.txt
1234579 bad
7654321 This line is OK
1234567 OK So is this
1112222 bad again
4443333 OK again
请原谅我笨拙的表情:我的awk是旧的,它不理解像:\d{7}这样的奇特表情。如果要从vim内部为整个文件调用此命令:

:%!awk -f seven.awk

现在,要得到真正的答案

匹配不以7位数字开头的字符串的正则表达式非常简单:

.{0,6}([^0-9].*)?
没有
{}
语法的更经典的regex等价物实际上更具可读性:它直观地向我们展示了正在发生的事情:

(|.|..|...|....|.....|......)([^0-9].*)?
即0到6个字符之间的匹配,可以是任何字符,可选地后跟一个非数字字符,如果出现,可能后跟零个或多个附加字符。这可以确保如果匹配了七个字符或更长的字符串,则前七个字符中至少有一个是非数字字符

为了将其转换为Vim中的匹配线,我们添加了一些转义和锚定:

^.\{0,6\}\([^0-9].*\)\?$

我不“做”
\d
;太新潮了。:)

这个答案很接近,但是另一个答案的连接在连接在一起的行之间留下了一个空间(这实际上是我需要的)。本例将第一行的最后一个字符直接放在下一行的第一个字符之前。这是我需要避免的副作用。尽管如此,+1还是感谢你的回答。哦,好吧!但是可以这样添加空间::%s/$\n^\(\d\{7}\)\@/别后悔。另一个比较短,我很懒;很明显,它们都产生了相同的结果。虽然对我来说,没有^的那一个实际起作用是没有意义的,但我认为没有。唯一的区别是,如果行中除开头以外的其他地方有一个七位数字,那么没有^的那一个将匹配。啊,是的,我明白了。在这种情况下没有,所以没有额外的行被修改。。。解释为什么更少行的计数完全相同:v/^\d\{7}/-1j命令对我不起作用:一些“好”行与“坏”行连接;连接的线条之间有一个空格。@Hai Vu:我想你误解了它在做什么。它将前一行连接到七位数字行,而不管前一行是什么。中间的空格是
j
(join)命令的标准行为,尽管可以调整。我最初也有[0-9]次。我很高兴gVim的前编辑允许了\d{7}快捷方式。顺便说一句,当我写最后一行时,我祈求好运,并在同一个月制作了这个提交:
^.\{0,6\}\([^0-9].*\)\?$