egrep \ b无法识别单引号

时间:2016-10-21 21:24:45

标签: regex grep

我正在尝试使用egrep列出文件中的所有3个字母单词。

示例输入;

抽头

悬崖

可'吨

可以

正则表达式;

egrep "\b[a-zA-Z]{3}\b"

我列出了3个字母的单词,但为什么无法显示在结果中?

修改

我收到了原始问题的答案,现在我正在使用;

egrep '^[a-zA-Z]{3}$'

这是有效的,因为我每行只有1个单词。我的问题现在更新了,因为答案有点脆弱。

如果输入不是每行1个字而是行和段落,我将如何搜索3个字母的单词?

2 个答案:

答案 0 :(得分:2)

由于您的文件每行显然只有一个单词,因此锚定到行结尾而不是单词边界。

egrep -i '^[a-z]{3}$' | sort

您的代码存在的问题是\b匹配任何单词字符和非单词字符,'是非单词字符。

答案 1 :(得分:2)

如果每行有多个单词,则无法使用锚点。

如果你的grep支持-P(PCRE)选项,那么你可以使用lookahead regex:

grep -oiP '\b[a-z]{3}(?=\s|$)' file

如果-P不可用,您可以使用:

grep -oiE '\b[a-z]{3}(\s|$)' file

第二个grep将有一个尾随空格。如果你想删除它,那么使用:

grep -oiE '\b[a-z]{3}(\s|$)' file | awk '{print $1}'

另外这里是awk解决方案,可以打印所有3个字母的字段:

awk '{for (i=1; i<=NF; i++) if (length($i)==3) print $i}' file

如果你有gnu awk,那么你可以缩短它:

awk -v RS='[[:space:]]' 'length($0) == 3' file