在Vim中不带上下文打印所有匹配的模式- Vim等效于`grep -o`

mjqavswn  于 2023-08-05  发布在  其他
关注(0)|答案(1)|浏览(129)

如何在Vim中打印所有匹配值?
我在Vim中搜索grep -o <pattern> | sort | uniq的等价物。
该解决方案应独立于操作系统工作,并且不使用grep。

示例

假设您有搜索模式/\w\+um\>/和以下文本:

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum pulvinar
aliquam viverra. Aenean accumsan et neque ac hendrerit.

Suspendisse tincidunt congue bibendum. Duis egestas tempor feugiat. 
Curabitur egestas nunc nisi, id tristique libero finibus et. 

Pellentesque lacus ex, molestie eget neque eget, ullamcorper gravida quam. 
In rutrum et lectus luctus faucibus. In sollicitudin rutrum accumsan. Sed 
quis libero viverra, dignissim metus vehicula, viverra urna. Proin sed diam 
pellentesque, dictum tortor eget, sollicitudin eros.

字符串
有没有办法打印所有以um结尾的单词?

ipsum
Vestibulum
bibendum
rutrum
rutrum
dictum


更妙的是:有没有办法打印每个以um结尾的单词?

bibendum
dictum
ipsum
rutrum
Vestibulum


我的第一个尝试是使用:g//命令。然而,所有的行搜索都被打印出来了,这与我正在寻找的内容不相符。

ozxc1zmp

ozxc1zmp1#

Ex命令倾向于面向行,并且没有完全按照您的要求执行的内置函数。
这将适用于第一个要求:

:echo getline(1,'$')
    \ ->join()
    \ ->split(' ')
    \ ->filter({ _, v -> v =~ '\w\+um\>' })
    \ ->join("\n")

字符串
您在哪里:

  • 得到所有:help getline()的行的列表
  • 将行列表转换为具有:help join()的单个字符串,
  • 将单个字符串拆分成具有:help split()的单词列表,
  • 根据您的模式使用:help filter()过滤列表,
  • 将列表转换为具有join()的单个多行字符串,
  • 重复一下

您可能需要添加额外的步骤来删除标点符号。
为第二个需求添加:help uniq()

:echo getline(1,'$')
    \ ->join()
    \ ->split(' ')
    \ ->filter({ _, v -> v =~ '\w\+um\>' })
    \ ->uniq()
    \ ->join("\n")

相关问题