对于搜索中文,rg > grep > ag/ack?


#1

没有全面测试,仅考虑到两点发现:

  • rg 支持 GBK 等中文编码,grep/ag/ack 不支持

    $ rg --encoding gb18030 宝玉.妙玉 Red_Mansions_Anasoft_A_CHS_GBK_txt.txt
    2261:  宝玉和妙玉陪笑道
    
    # 能搜索 Raw Bytes [1] 的也不算支持
    $ LC_ALL=C grep -P '\xB1\xA6\xD3\xF1..\xC3\xEE\xD3\xF1' Red_Mansions_Anasoft_A_CHS_GBK_txt.txt | iconv -f GB18030
      宝玉和妙玉陪笑道
    
  • 对于 UTF-8,rg 和 grep 的正则表达式中 . 支持中文字符,ag/ack 不支持

    $ grep 宝玉.妙玉 Red_Mansions_Anasoft_A_CHS_UTF8_txt.txt
      宝玉和妙玉陪笑道
    $ rg 宝玉.妙玉 Red_Mansions_Anasoft_A_CHS_UTF8_txt.txt
    2261:  宝玉和妙玉陪笑道
    
    $ ag 宝玉.妙玉 Red_Mansions_Anasoft_A_CHS_UTF8_txt.txt
    $ ack 宝玉.妙玉 Red_Mansions_Anasoft_A_CHS_UTF8_txt.txt
    
    # ag/ack 需要三个 . (在 UTF-8 中汉字一般占 3 Bytes)
    $ ag 宝玉...妙玉 Red_Mansions_Anasoft_A_CHS_UTF8_txt.txt
    2261:  宝玉和妙玉陪笑道
    $ ack 宝玉...妙玉 Red_Mansions_Anasoft_A_CHS_UTF8_txt.txt
      宝玉和妙玉陪笑道
    

Links


[1] 在 Emacs 中用 C-u C-x = (what-cursor-position) 查询字符的编号,或用:

(defun unicode->other-encoding (char coding)
  (mapconcat
   (lambda (x) (format "%02X" x))
   (encode-coding-char char coding)
   " "))
     => unicode->other-encoding

(unicode->other-encoding ?宝 'gb18030)
     => "B1 A6"

Emacs Lisp 的字符对应的数字就是其 Unicode Codepoint。


rg vs ag?
#2

rg 好,跨平台,还快。

GBK 好像是 GB18030 的子集,一般不需要严格区分。


#4

Win下rg不好用,至少是在Emacs的shell-mode里。


#5

忽然发现 ag 竟然这么不靠谱。

有匹配的时候看起来还正常:

没有匹配的时候就乱来了:


#6
$ ag 'lsp-[^\-]+-enable'

或许是因为 Ag 的正则表达式默认是跨行的,加上 --nomultiline 就好了

   --[no]multiline
          Match regexes across newlines. Enabled by default.

#7

确实是 multiline 选项引起的。不过这跨度没限制也是有问题的,隔着十万八千行都能匹配到。

虽然 multiline 存在隐患,但这个选项还是开启比较好,因为关掉就真的有 bug 了:


#8

什么时候rg支持拼音搜索就好拉


#9

ag有unicode问题,搜索中文还是rgpt靠谱,跨平台,速度也不错。rg最快,pt占用内存稍多。


#10

我在Windows下用的挺好,直接下载Windows原生版本,VS编译那个,速度很不错。


#11

rg 是用 rust 编程语言,原生支持 unicode


#12

这你就不知道了,Unicode 和 Go 是还同一帮人搞的。


#13

rg可以配置支持拼音搜索,加上pinyinlib就可以了。


#14

https://github.com/BurntSushi/ripgrep 没搜到相关的feature啊


#15

emacs中用rg和pinyinlib可实现。可以参考我的配置:https://github.com/seagle0128/.emacs.d


#16

rg --encoding 指定编码实在太爽了 :slight_smile: