根据长度选择线

shi*_*iva 6 grep text-processing

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

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

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

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

Sté*_*las 16

正好 120 个字符

grep

grep -xE '.{120}' < your-file
grep -x '.\{120\}' < your-file # more portable
Run Code Online (Sandbox Code Playgroud)

awk

awk 'length == 120' < your-file
Run Code Online (Sandbox Code Playgroud)

从 0 到 120 个字符

grep

grep -xE '.{0,120}' < your-file
grep -x '.\{0,120\}' < your-file # more portable
Run Code Online (Sandbox Code Playgroud)

awk

awk 'length <= 120' < your-file
Run Code Online (Sandbox Code Playgroud)

对于严格小于 120,请将 120 替换为 119 或替换<=<

120 个字符或以上:

grep

grep -E '.{120}' < your-file # lines that contain a sequence of 120 characters
grep '.\{120\}' < your-file # more portable
Run Code Online (Sandbox Code Playgroud)

还有一些选择:

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

awk

awk 'length >= 120' < your-file
Run Code Online (Sandbox Code Playgroud)

对于严格超过 120 的情况,请将 120 替换为 121 或替换>=>


那些假设输入是根据语言环境的charmap 正确编码的有效文本。如果输入包含 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}'
e?te?
$ echo $'e\u0301te\u0301' | grep -xE '.{5}'
e?te?
$ echo $'e\u0301te\u0301' | LC_ALL=C grep -xE '.{7}'
e?te?
Run Code Online (Sandbox Code Playgroud)

(即e?te?3 个字素簇,5 个字符,7 个字节)。

并非所有grep -P实现都支持\X. 有些只支持UTF-8 多字节charmap。

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