我有一个文件,大约有1000行。除了偶尔的几行之外,所有行都以七位数开头。我需要捕获这些行并将它们与前一行合并。
我已经成功使用以下正则表达式模式匹配所有以七位数字开头的行:
^\d\{7}
我似乎无法使它匹配任何不符合这种模式的行,然而这确实是我想要的。
作为一个嵌入到这个问题中的第二个问题。是否有可能使任何匹配的行(或者不匹配以保持与我所试图做的事情一致)与前一行连接在一起(而不是使用J命令将下一行带到当前行)?
谢谢
^\(\d\{7}\)\@!
这是Vim用于负向先行断言的正则表达式语法。
如果你想将其作为批量:
命令来执行,你应该只需执行:
:v/^\d\{7}/-1j
现在,为了真正的答案
匹配不以7个数字开头的字符串的正则表达式非常简单:
.{0,6}([^0-9].*)?
没有使用 {}
语法的经典正则表达式实际上更易读:它可以直观地展示我们正在进行的操作:
(|.|..|...|....|.....|......)([^0-9].*)?
即匹配0到6个任意字符,可选跟着一个非数字字符,如果存在的话,可以跟着零个或多个额外的字符。这确保了如果匹配了七个或更长的字符串,则前七个字符中至少有一个是非数字。
要将其翻译成在Vim中匹配行的格式,我们需要添加一些转义和定位符:
^.\{0,6\}\([^0-9].*\)\?$
^\(\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 -f seven.awk
<a href
开头的行,我会尝试使用以下命令:/^\(<a href\)\+\@!
。但是,我会收到以下错误提示:E871: (NFA regexp) Can't have a multi follow a multi !
。 - Olivier Pons\v
会简化事情并使其更像PCRE语法:\v^(\d{7})@!
。 - jdhao