You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 08:27:04