如何使用sed读取行式后缀列表 对文本文件执行单次后缀移除词干提取
原脚本问题分析
你的脚本存在3个核心问题导致结果不符合预期:
- 逐次修改
text.txt,前一轮移除后缀的结果会作为后一轮的匹配输入,出现多次移除后缀的情况,违背了「仅对单词原始形态执行单次匹配」的要求 - 没有优先匹配更长的后缀,可能出现短后缀先截断单词,导致长后缀无法匹配的问题
- 替换规则没有严格限定匹配单词结尾,极端场景下会误匹配单词中间的相同字符串
解决代码
直接执行以下命令即可得到符合要求的结果:
#!/bin/bash # 一次性生成所有规则批量处理,避免多次修改互相干扰 sed -f <(sort -r -n -k1.1 suffix.txt | awk '{print "s/\\<([a-z]+)"$1"\\>/\\1/g"}') text.txt
如果需要直接修改原text.txt,给sed加-i参数即可:
sed -i -f <(sort -r -n -k1.1 suffix.txt | awk '{print "s/\\<([a-z]+)"$1"\\>/\\1/g"}') text.txt
逻辑说明
- 先用
sort将后缀列表按长度从长到短排序,保证长后缀优先匹配,不会被短后缀提前截断 - 用
awk为每个后缀生成sed替换规则,\<和\>是单词边界符,严格限定后缀必须出现在单词末尾,([a-z]+)捕获后缀前的单词内容,替换后直接移除后缀 - 所有规则一次性传入
sed执行,所有匹配都基于原始文本,不会出现多次修改导致的重复移除问题
内容的提问来源于stack exchange,提问作者Shikhar Agrawal
相关产品推荐
相关产品推荐

