使用GnuWin32版sed去除文本重复单词失败,求解决办法
解决GnuWin32版sed去除重复单词的问题
嘿,我完全懂你用GnuWin32版sed处理重复单词时的挫败感——那些网上常见的sed方案居然不管用,确实挺闹心的!大概率是因为很多教程里的方法依赖GNU sed的扩展特性,而GnuWin32的sed在默认配置下的正则处理逻辑有细微差异。
针对你的需求:输入One two three bird animal two bird,输出One two three bird animal(保留单词首次出现的顺序,移除后续重复项),这里有个适配GnuWin32 sed的解决方案:
方法1:使用sed的循环替换+保留空间
直接运行以下命令(可以处理单行文本,也可以读取文件):
sed ":loop; s/\b\([a-zA-Z]\+\)\b\(.*\)\b\1\b/\1\2/; t loop" your_input.txt
命令解释:
:loop:定义一个循环标签,方便后续重复执行替换操作s/\b\([a-zA-Z]\+\)\b\(.*\)\b\1\b/\1\2/:\b:匹配单词边界,确保我们替换的是完整单词而非子串\([a-zA-Z]\+\):捕获第一个出现的单词(如果你的单词包含数字/下划线,可改成[a-zA-Z0-9_]\+)\(.*\):捕获该单词后面的所有内容\b\1\b:匹配后续重复的相同单词- 替换为
\1\2:保留首次出现的单词和后面的内容,去掉重复项
t loop:如果上一次替换成功,就跳回loop标签继续处理,直到没有重复单词为止
测试效果
把你的测试文本输入进去:
输入:One two three bird animal two bird
输出:One two three bird animal
完美符合你的需求!
如果你的GnuWin32 sed支持扩展正则(加-r参数),也可以用更简洁的写法:
sed -r ":loop; s/\b([a-zA-Z]+)\b(.*)\b\1\b/\1\2/; t loop" your_input.txt
内容的提问来源于stack exchange,提问作者Yurii Kosiak
相关产品推荐
相关产品推荐

