在文本文件中搜索以 或 开头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]
将匹配单个i
或g
。- 此特定正则表达式中的所有其他字符 (
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”才能匹配
- 成功匹配后,我们会显示该单词。