【问题标题】:How do I get Vim to match a line not beginning with a seven-digit number?如何让 Vim 匹配不以七位数字开头的行?
【发布时间】:2009-09-21 18:30:13
【问题描述】:

我有一个大约 1000 行的文件。除偶尔行外,所有行均以七位数字开头。我需要抓住这些行并将它们与上一行实际连接起来。

我已经设法通过使用以下正则表达式模式匹配任何以七位数开头的行:

^\d\{7}

我似乎无法让它匹配任何 不匹配此模式的行,这正是我所追求的。

作为第二个问题,我将嵌入到这个问题中。是否可以让任何匹配的行(或不匹配以与我正在尝试做的事情保持一致)将自己加入上一行(而不是 J 命令带来下一行到当前行)?

谢谢

【问题讨论】:

    标签: regex vim


    【解决方案1】:
    ^\(\d\{7}\)\@!
    

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

    如果您将其作为大量 : 命令执行,您应该可以这样做

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

    【讨论】:

    • 奇怪的是,它们都产生了相同的结果。虽然对我来说,没有 ^ 的那个实际上在工作是没有意义的,但我认为没有。
    • 唯一的区别是,如果在除开头之外的其他地方有一个七位数字,则没有 ^ 的那个将匹配。
    • 啊,是的,我明白了。在这种情况下没有,所以没有修改额外的行......解释了为什么更少的行数完全相同。
    • :v/^\d\{7}/-1j 命令对我不起作用:一些“好”行与“坏”行结合在一起;并且连接的线之间有一个空格。
    • @Hai Vu:我认为你误解了它在做什么。它将上一行连接到七位数字行,无论上一行是什么。之间的空格是j(join)命令的标准行为,尽管可以调整。
    【解决方案2】:

    现在,真正的答案

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

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

    没有{} 语法的更经典的正则表达式等效实际上更具可读性:它直观地向我们展示了正在发生的事情:

    (|.|..|...|....|.....|......)([^0-9].*)?
    

    即匹配 0 到 6 个字符,可以是任何字符,可选地后跟一个非数字,如果它出现,后面可以跟零个或多个附加字符。这样可以确保如果匹配一个包含七个字符或更长字符的字符串,则前七个字符中至少有一个是非数字。

    为了在 Vim 中将其翻译成匹配行,我们添加了一些转义和锚定:

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

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

    【讨论】:

    【解决方案3】:

    正则表达式

    ^\(\d\{7}\)\@!
    

    会反转你原来的表达方式。有关此语法的更多信息,请参见此处:

    :help \@!
    

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

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

    【讨论】:

    • 这个很接近,但是来自另一个答案的连接在连接在一起的行之间留下了一个空格(这实际上是我需要的)。此示例将第一行的最后一个字符直接放在下一行的第一个字符之前。这是我需要避免的副作用。不过,为您的回答 +1,谢谢。
    • 哦,好吧!空格可以这样添加: :%s/$\n^\(\d\{7}\)\@!/ /g
    • 确实如此。另一个较短,但我很懒;P
    【解决方案4】:

    这是我使用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
    

    【讨论】:

    • 我最初也有 [0-9] 七次。我很高兴 gVim 中的前编辑器允许使用 \d{7} 快捷方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-27
    • 2014-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多