根据长度选择线

根据长度选择线

我想使用grep或其他合适的工具来查找(和打印)线条,不是基于某种模式,而是基于长度。

假设我有一个包含两行的文件,其中

  • 第 1 行:长度 = 300 个字符
  • 第 2 行:长度 = 120 个字符

我正在寻找一个只输出第 2 行的命令。

答案1

正好 120 个字符

grep

grep -xE '.{120}' < your-file
grep -x '.\{120\}' < your-file # more portable

awk

awk 'length == 120' < your-file

0 到 120 个字符

grep

grep -xE '.{0,120}' < your-file
grep -x '.\{0,120\}' < your-file # more portable

awk

awk 'length <= 120' < your-file

为了严格小于 120,将 120 替换为 119<=<

120 个字符或以上:

grep

grep -E '.{120}' < your-file # lines that contain a sequence of 120 characters
grep '.\{120\}' < your-file # more portable

还有一些其他选择:

grep -E '^.{120}' < your-file # lines that start with a sequence of 120 characters
grep '^.\{120\}' < your-file # more portable
grep -xE '.{120,}' < your-file # lines that have 120 or more characters
                               # between start and end.
grep -x '.\{120,\}' < your-file # more portable

awk

awk 'length >= 120' < your-file

为了严格超过120,将 120 替换为 121 或者>=替换为>


这些假设输入是根据区域设置的字符映射正确编码的有效文本。如果输入包含 NUL 字符、不形成有效字符的字节序列、大于LINE_MAX(以字节数计)的行或未分隔的最后一行(在grep;的情况下awk将添加缺少的分隔符),您的里程可能会有所不同。

如果您想根据字节数而不是字符数进行过滤,请将区域设置设置为CPOSIX( LC_ALL=C grep...)。

要根据字素簇的数量而不是字符进行过滤,并且如果您grep支持某个-P选项,则可以将 替换EP上面.\X

比较:

$ locale charmap
UTF-8
$ echo $'e\u0301te\u0301' | grep -xP '\X{3}'
été
$ echo $'e\u0301te\u0301' | grep -xE '.{5}'
été
$ echo $'e\u0301te\u0301' | LC_ALL=C grep -xE '.{7}'
été

(即été3 个字素簇、5 个字符、7 个字节)。

并非所有grep -P实现都支持\X.有些仅支持 UTF-8 多字节字符映射。

请注意,基于显示宽度的过滤又是另一回事,给定字符串的显示宽度取决于显示设备。请参阅获取字符串的显示宽度了解更多相关信息。

相关内容