Regex vim搜索不以特定字符串开头的行

Regex vim搜索不以特定字符串开头的行,regex,search,vim,Regex,Search,Vim,我有一个文件,其中有数十万行以日期开头,例如 2021-02-22... 但有些奇怪的事情并不是这样开始的。我的意图是编写一个宏来查找它们,并用上面的行连接它们 如何从vim中搜索这些行 例如,如果我想在vim中找到下一个匹配行,我会键入 /^2021 这将带我进入下一行,以“2021”开头 我想这样做,但要搜索下一个不匹配的行。这将查找并选择一个不以2021开头的非空行: /^[^2]\([^0]\([^2]\([^1]\)\?\)\?\)\?.* 说明: [^2]-预期字符不是2

我有一个文件,其中有数十万行以日期开头,例如

2021-02-22... 
但有些奇怪的事情并不是这样开始的。我的意图是编写一个宏来查找它们,并用上面的行连接它们

如何从vim中搜索这些行

例如,如果我想在vim中找到下一个匹配行,我会键入

/^2021
这将带我进入下一行,以“2021”开头


我想这样做,但要搜索下一个不匹配的行。

这将查找并选择一个不以
2021
开头的非空行:

/^[^2]\([^0]\([^2]\([^1]\)\?\)\?\)\?.*
说明:

  • [^2]
    -预期字符不是
    2
  • 使用
    \([^]\)\?
    将其他数字添加为嵌套的可选字符,其中
    表示一个数字

这将查找并选择不以
2021开头的非空行:

/^[^2]\([^0]\([^2]\([^1]\)\?\)\?\)\?.*
说明:

  • [^2]
    -预期字符不是
    2
  • 使用
    \([^]\)\?
    将其他数字添加为嵌套的可选字符,其中
    表示一个数字
我的意图是编写一个宏来查找它们,并用上面的行连接它们

这种操作通常使用
:help:global

:g!/<pattern>/<command>
在哪里

  • ^2021
    是您的模式
  • -j
    首先将地址设置为上一行,然后将其与下一行连接
您可能会发现此选项更直观:

:g!/^2021/norm! kJ
它基本上使用了与
:-j
相当的正常模式

如果你在该文件中有几年,考虑一个简单的交替:

:g!/^\(2021\|2020\|2019\)/-j
或更通用的模式:

:g!/^\d\d\d\d-\d\d-\d\d/-j
在这里,你不必试着变得聪明,用量词和负面表情等等

参考:

:help :global
:help :range
:help :join
:help :normal
:help k
:help J
:help /^
:help \d
:help /\|
:help /\(
我的意图是编写一个宏来查找它们,并用上面的行连接它们

这种操作通常使用
:help:global

:g!/<pattern>/<command>
在哪里

  • ^2021
    是您的模式
  • -j
    首先将地址设置为上一行,然后将其与下一行连接
您可能会发现此选项更直观:

:g!/^2021/norm! kJ
它基本上使用了与
:-j
相当的正常模式

如果你在该文件中有几年,考虑一个简单的交替:

:g!/^\(2021\|2020\|2019\)/-j
或更通用的模式:

:g!/^\d\d\d\d-\d\d-\d\d/-j
在这里,你不必试着变得聪明,用量词和负面表情等等

参考:

:help :global
:help :range
:help :join
:help :normal
:help k
:help J
:help /^
:help \d
:help /\|
:help /\(

这有用吗?我不想生成所有不匹配行的列表,我想移动到下一个不匹配行。就像“/”所做的,但对于不匹配的模式,这有帮助吗?我不想生成所有不匹配行的列表,我想移动到下一个不匹配行。就像“/”所做的一样,但对于不匹配的模式,我也尝试了消极的向后看和向前看,例如
/^\(\)\@!2021年
但这不起作用。仅供参考,我还尝试了消极的向后看和向前看,例如
/^\(\)\@!2021年
,但这不起作用。将
:加入负范围也起作用吗?e、 g
:g/^2021/-1join
:v/^2021/-j
@PeterRincker
:g/^2021/-j
:v/^2021/-j
可以,是的。你认为我应该把它添加到我的答案中,还是你想发布你自己的答案?我认为把它添加到你的评论中是最好的。它实际上只是使用了与正常的
j
非常相似的
:join
命令。负范围的
:join
也可以工作吗?e、 g
:g/^2021/-1join
:v/^2021/-j
@PeterRincker
:g/^2021/-j
:v/^2021/-j
可以,是的。你认为我应该把它添加到我的答案中,还是你想发布你自己的答案?我认为把它添加到你的评论中是最好的。它实际上只是使用了
:join
命令,这与普通的
j
非常相似。