Answers:
根据我的测试,以降低速度的顺序(在UTF-8语言环境下的GNU系统上和在ASCII输入上):
grep '.\{80\}' file
perl -nle 'print if length$_>79' file
awk 'length>79' file
sed -n '/.\{80\}/p' file
除了perl
¹一个(或awk
/ grep
/ sed
实现(像mawk
或busybox的),其不支持多字节字符),计数在数量方面的长度字符(根据LC_CTYPE
语言环境的设置),而不是字节。
如果输入中的字节不构成有效字符的一部分(当区域设置的字符集为UTF-8且输入采用不同的编码时,有时会发生这种情况),则根据解决方案和工具实现,这些字节将被视为1个字符,或者为0或不匹配.
。
例如,在UTF-8语言环境中,由30 a
sa 0x80字节,30 b
s,0x81字节和30 UTF-8 é
s(编码为0xc3 0xa9)组成的行.\{80\}
与GNU grep
/ 不匹配sed
(因为独立的0x80字节不匹配.
),则长度为30 + 1 + 30 + 1 + 2 * 30 = 122 perl
或mawk
,3 * 30 = 90 gawk
。
如果你想以字节为单位来算,固定区域设置C
使用LC_ALL=C grep/awk/sed...
。
那将使所有4个解决方案都考虑到上面的行包含122个字符。除了in perl
和GNU工具外,对于包含NUL字符(0x0字节)的行,您仍然可能会遇到问题。
¹ 尽管perl
行为会受到PERL_UNICODE
环境变量的影响
awk
如果您放下($0)
它可以更近一些,这还是隐含的;)。
^
,则速度会稍快一些:例如grep '^.\{80\}' file
。
grep '^.\{1000\}' file
返回grep: invalid repetition count(s)
,而awk 'length>1000' file
成功。)
Shell方法:
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