在字典文件中查找具有特定特征的单词

在字典文件中查找具有特定特征的单词

在文本文件中搜索以 或 开头b和结尾o并包含i或 的单词。g

必须在显示具有上述规范的单词的终端中键入命令。

我使用了以下内容,但它不止于一个单词并且包含空格:

~$  egrep -n '\bb.*(i|g).*o\b'

我使用的是 Linux Ubuntu,不确定如何执行该声明。我尝试了一些指令,但都失败了。任何人都可以帮我解开正则表达式语句,因为我很难这样做?

举个例子:假设我在文本文件中有以下随机单词:

boo djhg
bio jdjjf
dgdhd bgo
ghhh

然后需要突出显示“boo”、“bio”和“bgo”等词。

答案1

您要查找的命令是grep,您想要的正则表达式是b[[:alnum:]]*[ig][[:alnum:]]*o

  • [[:alnum:]]将匹配单个字母数字字符。
  • *将匹配前一个表达式的任意数字(包括零)。
  • [ig]将匹配单个ig
  • 此特定正则表达式中的所有其他字符 (b和) 都与自身匹配。o

使用[[:alnum::]]*not 可以避免.*匹配包含空格的单词。

grep用法就像

grep OPTIONS 'EXPRESSION' INPUT-FILES

并将输出EXPRESSION与其标准输出(在本例中为终端)匹配的行。

在这种情况下,您需要使用-w-o选项,它强制表达式匹配单词(由非单词字符包围的字符串)并仅返回匹配的数据(而不是整行)。

$ grep -w -o 'b[[:alnum:]]*[ig][[:alnum:]]*o' words
bio
bgo

你提到你想强调匹配的单词。这是 GNUgrep可以做的事情。我-o在这里放弃了获取每场比赛的整行的选项,否则你只会得到与之前相同的结果,但突出显示,这会很无聊。

$ grep --color -w 'b[[:alnum:]]*[ig][[:alnum:]]*o' 个单词
生物杰杰杰夫
dgdhd巴戈

正如您所看到的,这仅显示包含匹配项的行上的匹配项。要查看完整的输入(甚至没有匹配的行),并突出显示匹配项,我们必须删除该-w选项并执行

$ grep --color -E '\bb[[:alnum:]]*[ig][[:alnum:]]*o\b|$' 个单词
生物杰杰杰夫
dgdhd巴戈

我们必须添加该-E选项,因为|是扩展的正则表达式。将\b在任何单词边界匹配。

答案2

我会用来grep这样做:

egrep -i "^b.*(i|g)+.*o$" /usr/share/dict/words
  • ^b以“b”开头
  • .*任何时候任何事
  • (i|g)*“i”或“g”一次或多次
  • o$以“o”结尾

答案3

set -f; for w in `cat /usr/share/dict/words`; do
   case $w in b*[ig]*o ) echo "$w" ;; esac
done
# you could as well say: $(< /usr/share/dict/words) in place of the backquoted cat.
# if your version of bash supports it.

我们将单词文件拆分为单词$w,然后对其进行通配符检查。

  • 通配符模式为:b*[ig]*o,可解读为:
  • $w 必须以字母“b”开头。
  • $w 必须以字母“o”结尾。
  • $w 必须包含中间的“i”或“g”才能匹配
  • 成功匹配后,我们会显示该单词。

相关内容