匹配特定长度的单词

时间:2018-07-27 17:27:13

标签: regex awk

如何匹配特定长度的单词(比如说五个)?

给出文本的输入文件temp

1) ci sono quattro mele
2) sentiamoci il 16 ottobre 2018
3) decidiamo il 17 ottabre 2017
4) Manipolo di eroi
5) 17 mele
6) 18 ott 2020
7) una mela e mezza
8) 2 mele

如果我这样做:

awk '/[[:lower:]]{5}/ {print}' temp

我希望句子7)作为输出,因为这是唯一一个长度为5mezza)的单词。实际上,它返回的行的长度等于或大于5

此行为与我咨询的任何信息源均不兼容:

构造{n}应该精确匹配n次。在这一点上,恐怕我缺少明显的东西。

5 个答案:

答案 0 :(得分:3)

之所以匹配,是因为它在较长的字符串中找到了5个小写字母的字符串。您需要调整您的正则表达式,以使“单词”匹配被空白包围。别忘了还要在“单词”边界中处理字符串的开头/结尾。

答案 1 :(得分:2)

结构{n} 确实匹配了n次,您所缺少的是一个7个字母的单词内有5个字母,因此匹配{5}。您还需要指定在这5个字母之前或之后的内容,以免出现部分匹配。

对于单词边界\<\>\w使用GNU awk作为单词组成字符:

$ awk '/\<\w{5}\>/' file
7) una mela e mezza

任何awk:

$ awk '/(^|[^[:alpha:]])[[:alpha:]]{5}([^[:alpha:]]|$)/' file
7) una mela e mezza

这些解决方案和其他解决方案显然将取决于您所说的“单词”的含义。

答案 2 :(得分:1)

如果它总是被空格包围,则可以执行以下操作 [[:lower:]]{5}\s+\s+[[:lower:]]{5}\s+ (取决于您想做什么)

答案 3 :(得分:1)

由于您拥有awk的全部功能,为什么要限制自己进行正则表达式匹配?

$ awk -v RS='[ \n]' 'length($0)==5' file

mezza

答案 4 :(得分:1)

Regex101

grep -P '(?<![[:lower:]])[[:lower:]]{5}(?![[:lower:]])' temp

  • 找5个更低的
  • 使用消极的表情在后面

Unix示例

7) una mela e mezza

结果

perl -ne 'print if /(?<![[:lower:]])[[:lower:]]{5}(?![[:lower:]])/' temp

Perl示例(相同的输出)-ty @Ed Morton

AuthenticatorActivity