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
非常相似。