为何循环执行rg的Shell脚本与单行rg -f命令结果不一致?
问题与解答
问题描述
初始疑问
我编写了一段可正常运行的Shell脚本:
#!/bin/sh for ID in `cat comment_g.txt` do rg -w $ID wordsuc.txt >> out.txt done
但执行单行命令 rg -w -f comment_g.txt wordsuc.txt > out2.txt 却未返回任何记录。请问该单行命令与上述Shell脚本功能是否等效?
补充场景测试
英文内容场景(两者均正常工作)
comment_g.txt内容:
and
ordsuc.txt内容:
this that more and
执行结果:
# rg -w -f comment_g.txt ordsuc.txt 3:more and # grep -w -f comment_g.txt ordsuc.txt more and
多语言字符场景(结果不一致)
comment_g.txt内容:
सदस्य
ordsuc.txt内容:
सदस्य आणि नोंद पूर्व संकल्पनांना बळी पडले आहेत
执行结果:
- 单行命令无输出(预期返回1行):
# rg -w -f comment_g.txt ordsuc.txt - 脚本执行得到正确输出:
# sh run.sh # cat out.txt सदस्य आणि
请问为何会出现这种差异?
解答
功能等效性说明
从设计逻辑上,两者本应功能等效:都是读取comment_g.txt中的关键词,通过rg -w(整词匹配)在wordsuc.txt中查找结果。但实际运行的差异,根源在Unicode多语言字符的边界处理逻辑上。
多语言场景差异原因
这是ripgrep(rg)在处理Unicode单词边界时的细节差异导致的:
- 脚本循环中单独传入印地语关键词
सदस्य时,rg -w能正确识别Unicode字符的单词边界,匹配到सदस्य आणि中的完整目标词。 - 使用
-f comment_g.txt批量读取关键词时,ripgrep对文件中行内容的Unicode边界识别逻辑出现偏差——默认可能将行内容按字节流处理,没有正确应用Unicode单词边界规则,导致整词匹配失败。
修复方案
要让rg -f的行为和脚本一致,可以显式指定Unicode匹配模式,添加--unicode参数(尽管ripgrep默认开启Unicode支持,但显式声明可强制修正边界识别逻辑):
rg -w --unicode -f comment_g.txt wordsuc.txt
内容的提问来源于stack exchange,提问作者shantanuo
相关产品推荐
相关产品推荐

