我正在尝试使用egrep列出文件中的所有3个字母单词。
示例输入;
抽头
带
剑
悬崖
可'吨
可以
不
正则表达式;
egrep "\b[a-zA-Z]{3}\b"
我列出了3个字母的单词,但为什么无法显示在结果中?
修改
我收到了原始问题的答案,现在我正在使用;
egrep '^[a-zA-Z]{3}$'
这是有效的,因为我每行只有1个单词。我的问题现在更新了,因为答案有点脆弱。
如果输入不是每行1个字而是行和段落,我将如何搜索3个字母的单词?
答案 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