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


Answers:


89

根据我的测试,以降低速度的顺序(在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 asa 0x80字节,30 bs,0x81字节和30 UTF-8 és(编码为0xc3 0xa9)组成的行.\{80\}与GNU grep/ 不匹配sed(因为独立的0x80字节不匹配.),则长度为30 + 1 + 30 + 1 + 2 * 30 = 122 perlmawk,3 * 30 = 90 gawk

如果你想以字节为单位来算,固定区域设置C使用LC_ALL=C grep/awk/sed...

那将使所有4个解决方案都考虑到上面的行包含122个字符。除了in perl和GNU工具外,对于包含NUL字符(0x0字节)的行,您仍然可能会遇到问题。


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


您所说的“高效”是什么意思?
rowantran 2012年

我认为管理工作意味着打字效率。awk如果您放下($0)它可以更近一些,这还是隐含的;)。
雷神

9
顺便说一句,如果您使用将regexp锚定到行的开头^,则速度会稍快一些:例如grep '^.\{80\}' file
cas

4
与所有其他解决方案不同,perl解决方案不考虑诸如UTF-8之类的可变大小编码。
BatchyX 2013年

6
足够大的N值对grep失败,而对awk成功。(例如grep '^.\{1000\}' file返回grep: invalid repetition count(s),而awk 'length>1000' file成功。)
mdahlman

1

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) > 79if len(line.strip()) > 79

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.