是否可以找到文件中超过 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
除了perl
1 之外(或awk
//不支持多字节字符的实现(如或 busybox)),它以字符数来grep
计算sed
长度mawk
人物(根据LC_CTYPE
语言环境的设置)而不是字节。
如果输入中的某些字节不构成有效字符的一部分(当区域设置的字符集为 UTF-8 并且输入采用不同的编码时,有时会发生这种情况),则根据解决方案和工具实现,这些字节要么算作 1 个字符,要么算作 0 或不匹配.
。
例如,在 UTF-8 语言环境中,由 30 a
sa 0x80 字节、30 b
s、一个 0x81 字节和 30 UTF-8 s(编码为 0xc3 0xa9)组成的行将与 GNU /é
不匹配(因为独立的 0x80 字节不匹配),使用or时长度为 30+1+30+1+2*30=122 ,使用 时长度为 3*30=90 。.\{80\}
grep
sed
.
perl
mawk
gawk
如果您想以字节为单位进行计数,请将区域设置修复为C
with LC_ALL=C grep/awk/sed...
。
这将使所有 4 个解决方案都认为上面的行包含 122 个字符。除了perl
GNU 工具之外,包含 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