查找任何超过特定长度的行

查找任何超过特定长度的行

是否可以找到文件中超过 79 个字符的行?

答案1

根据我的测试,按照速度递减的顺序(在 UTF-8 语言环境和 ASCII 输入的 GNU 系统上):

grep '.\{80\}' file

perl -nle 'print if length$_>79' file

awk 'length>79' file

sed -n '/.\{80\}/p' file

除了perl1 之外(或awk//不支持多字节字符的实现(如或 busybox)),它以字符数来grep计算sed长度mawk人物(根据LC_CTYPE语言环境的设置)而不是字节

如果输入中的某些字节不构成有效字符的一部分(当区域设置的字符集为 UTF-8 并且输入采用不同的编码时,有时会发生这种情况),则根据解决方案和工具实现,这些字节要么算作 1 个字符,要么算作 0 或不匹配.

例如,在 UTF-8 语言环境中,由 30 asa 0x80 字节、30 bs、一个 0x81 字节和 30 UTF-8 s(编码为 0xc3 0xa9)组成的行将与 GNU /é不匹配(因为独立的 0x80 字节不匹配),使用or时长度为 30+1+30+1+2*30=122 ,使用 时长度为 3*30=90 。.\{80\}grepsed.perlmawkgawk

如果您想以字节为单位进行计数,请将区域设置修复为Cwith LC_ALL=C grep/awk/sed...

这将使所有 4 个解决方案都认为上面的行包含 122 个字符。除了perlGNU 工具之外,包含 NUL 字符(0x0 字节)的行仍然存在潜在问题。


尽管行为可能会受到环境变量的perl影响PERL_UNICODE

答案2

外壳方法:

while IFS= read -r line || [ -n "$line" ];
do 
    [ "${#line}" -gt 79 ] && printf "%s\n" "$line"
done < input.txt

Python方法:

python -c 'import sys;f=open(sys.argv[1]);print "\n".join([ l.strip() for l in f if len(l) >79 ]);f.close()' input.txt

或者作为一个简短的脚本以提高可读性:

#!/usr/bin/env python
import sys

with open(sys.argv[1]) as f:
    for line in f:
        if len(line) > 79:
            print line.strip()

\n如果我们想从计算中排除换行符,我们可以if len(line) > 79使if len(line.strip()) > 79

旁注:这是 Python 2.7 语法。用于print()Python 3

相关内容