ファイル内の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、orを使用する場合は長さは3 * 30 = 90です。.\{80\}
grep
sed
.
perl
mawk
gawk
バイト単位で計算するには、ロケールをに変更しC
ますLC_ALL=C grep/awk/sed...
。
これにより、4つのソリューションすべてが上記の行に122文字が含まれていると考えられます。 GNUツールを除いて、perl
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の場合