特定の長さより長い線を探す

特定の長さより長い線を探す

ファイル内の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計算します。sedmawk数値(ロケール設定によって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、orを使用する場合は長さは3 * 30 = 90です。.\{80\}grepsed.perlmawkgawk

バイト単位で計算するには、ロケールをに変更しCますLC_ALL=C grep/awk/sed...

これにより、4つのソリューションすべてが上記の行に122文字が含まれていると考えられます。 GNUツールを除いて、perlNUL文字(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の場合

関連情報