【问题标题】:egrep \b not recognising single quoteegrep \b 不识别单引号
【发布时间】:2016-10-22 16:07:18
【问题描述】:

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

样本输入;

点击

腰带

悬崖

不能

可以

不是


正则表达式;

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

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

编辑

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

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

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

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

【问题讨论】:

  • 可能是因为' 算作一个单词边界,而在语言学术语中,这就是can not,它是两个三个字母的单词。
  • 是的,它有can,但没有单独列出,但我不想can!除非我使用 ^ 和 $ 而不是 \b?
  • 你能发布示例输入和预期输出吗?
  • 如果每个单词都是单独的,那么你不需要单词边界。 /^...$/ 可以解决问题。
  • \b 匹配单词字符与非单词字符相邻的任何位置。 n 是单词字符 ' 是非单词字符,所以它们之间是匹配的。

标签: regex grep


【解决方案1】:

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

如果您的 grep 支持 -P (PCRE) 选项,那么您可以使用前瞻正则表达式:

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}'

或者这是一个打印所有 3 个字母字段的 awk 解决方案:

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

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

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

【讨论】:

  • awk 答案是我想要的答案!这是我可以在任何地方使用的通用解决方案!谢谢
  • 您可以使用-w 选项仅匹配单词...grep -woiE '[a-z]{3}' 甚至grep -woi '[a-z][a-z][a-z]'
  • @Sundeep: -w 也会在can't 中找到 OP 不想要的 can
  • 没错,错过了这一点...awk 解决方案似乎是最好的,因为F'nor 之类的名称也会受到注意...
【解决方案2】:

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

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

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

【讨论】:

  • 样本输出与该假设一致。他没有使用-o,但每行只有一个字。
  • 或使用仅匹配整行的-x 选项
猜你喜欢
  • 2017-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-09
  • 1970-01-01
相关资源
最近更新 更多