【问题标题】:How do I grep for all words that are less than 4 characters?如何查找所有少于 4 个字符的单词?
【发布时间】:2011-02-13 02:29:28
【问题描述】:

我有一本字典,其中的单词用换行符分隔。

【问题讨论】:

标签: linux unix grep


【解决方案1】:

你可以这样做:

egrep -x '.{1,3}' myfile

这也会跳过空行,这在技术上不是单词。不幸的是,上述正则表达式会将缩写中的撇号计为字母以及连字符复合词中的连字符。在如此低的字母数下,连字符的复合词不是问题,但我不确定您是否想计算收缩中的撇号,这是可能的(例如,I'm)。您可以尝试使用正则表达式,例如:

egrep -x '\w{1,3}' myfile

...,但这只会匹配大写/小写字母,根本不匹配缩写或连字符的复合词。

【讨论】:

  • 实际上,比这更糟糕:\w 在 GNU grep 中被搞砸了,因为像 ^\w 这样的模式在像 "β-oxidation" 和 "γ-aminobutyric" 这样的字符串上失败了。我会运行perl -CSD -ne 'print if /^\W*(\w\W*){1,3}$/',因为这样它会处理缩略词和连字符,但不会将非单词字符计入 3 个限制。如果您关心实际字母,则可以使用 \pL\PL根据UTS#18 的要求,\w\W 的匹配范围比这甚至\p{Alphabetic} 更广泛。
【解决方案2】:

像这样: grep -v "^...." my_file

【讨论】:

  • @cbmanica,不,你错了。 “grep -v” 查找所有不匹配的行,我匹配任何包含 5 个或更多字符的行。换句话说,它返回任何包含 4 个或更少字符的行。
  • 鉴于 OP 想要查找“少于 4 个字符”的单词,恐怕您已经证实了我的断言,即您的答案不正确。
  • 是的,是少,不是小于或等于,反正是个好主意,明白了
【解决方案3】:

试试这个正则表达式:

grep -E '^.{1,3}$' your_dictionary

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    相关资源
    最近更新 更多