如何“grep”给定范围内的行长度?

如何“grep”给定范围内的行长度?

笔记:这个问题是对这个问答的补充:如何“grep”查找给定范围内*不*的行长度?


我只需要从文本文件(一个单词列表,用换行符分隔)中获取长度范围最小或等于 3 个字符,但不长于或等于 10 个字符的行。

例子:

输入:

egyezményét
megkíván
ki
alma
kevesen
meghatározó

输出:

megkíván
alma
kevesen

问题:我怎样才能做到这一点bash

答案1

grep -x '.\{3,10\}'

在哪里

  • -x(也--line-regexp适用于 GNU grep)将模式匹配到整行
  • .任何单个字符
  • \{3,10\}量化前一个符号的 3 到 10 倍(如果有的话)

答案2

使用grep -E

grep -E '^.{3,10}$'

这匹配由 3 到 10 个字符组成的行。

答案3

使用awk(并假设它是一个区域设置感知的实现,例如 GNU awk,因此具有短于三个字符的多字节字符的行(例如“Ők”)不匹配):

LC_ALL=hu_HU.UTF-8 awk 'length >= 3 && length <= 10' file

默认情况下,该length语句将返回(当前记录/行)的长度$0,代码使用它来测试行的长度是否在给定范围内。如果这样的测试没有相应的操作块,那么默认操作是打印记录。

对给定数据进行测试:

$ LC_ALL=hu_HU.UTF-8 awk 'length >= 3 && length <= 10' file
megkíván
alma
kevesen

与 Perl 类似:

$ LC_ALL=hu_HU.UTF-8 perl -C -lne '$l=length($_); print if ($l >= 3 && $l <= 10)' file
megkíván
alma
kevesen

答案4

我认为这对某人有用。通过扩展,如果您想匹配一行中的特定字符串不长于比如说 255 个字符,这将是一个解决方案。

用法:寻找一个字符串,但想要排除长行,例如您没有编写或不需要的缩小的 JS 文件

grep -x '.\{1,255\}theStringIWant.\{1,255\}'

有点黑客,因为你无法真正控制两端的长度不超过某个数字(可以是 1 和 255、255 和 1、或 255 和 255),但这在大多数情况下都可以排除缩小长线

BASH 新手提示\反斜杠是大括号的转义字符{}

例子/证明:

echo "aaaalocalStoragebbbbccccdd" | grep -x '.\{3,10\}localStorage.\{3,10\}' #works
echo "aaaalocalStoragebbbbccccdddd" | grep -x '.\{3,10\}localStorage.\{3,10\}' #doesn't work, dddd puts end string to 12 chars

相关内容