正则表达式搜索具有共同前缀的词根

正则表达式搜索具有共同前缀的词根

我最近对字典中共享“pro-”和“con-”作为前缀的单词感到好奇。例如,游行/让步、生产/引导、坦白/坦白、进步/代表大会等等。我基本上是在寻找与^pro(.+)$和匹配的任何单词^con(.+)$,其中捕获组的内容相同。

我最初的穴居人命令是:

sed -nr 's/^con(.+)$/\1/Ip' /usr/share/dict/words | \
xargs -I SUFFIX -n1 grep -i '^proSUFFIX$' /usr/share/dict/words

它似乎有效,只要存在匹配的“pro-”单词,就输出完整的“con-”单词。问题是,速度很慢。它会调用grep每个潜在的匹配项,要求它每次扫描整个字典。我可以通过制作一个只包含赞成/反对词的临时文件来加快速度,但感觉必须有一些有效的方法来做到这一点而不需要编写文件。

GNU 世界中有没有一种工具非常适合这种交叉搜索?

答案1

从我之前对问题本身的评论来看:

egrep '^(pro|con).* /usr/share/dict/words | sed -nE 's/^(pro|con)(.*)/\2/p' | sort | uniq -d 

将为您提供所有同时具有赞成和反对前缀的词库列表:

首字母抓住所有带有和前缀的egrep单词。然后我们使用从每个单词的开头剥离和,列表,然后使用来显示proconsedproconsortuniq -d奥尼列表中具有重复项的条目。

答案2

这将打印出不带 pro|con 前缀的单词:

grep '^\(pro\|con\)' /usr/share/dict/words | cut -c 4- | sort | uniq -c | awk '$1 == 2 {print $2}'

答案3

在这种特殊情况下 - 已排序的输入,因此所有con...单词都列在pro...单词之前 - 您可以用来awk将匹配的行存储^con在数组中,当到达匹配的行时^pro,用替换procon如果结果在数组中,则打印词根:

awk '/^con/{arr[$0]=$0}; /^pro/{c=gensub(/pro/, "con", 1)
if (c in arr) print substr(c, 4)}' /usr/share/dict/words
……
……
文斯
文斯
职业
职业的
职业
沃克
沃克德
沃克斯
打电话

相关内容