尋找任何超過特定長度的行

尋找任何超過特定長度的行

是否可以找到文件中超過 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計算sed長度mawk人物(根據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 ,使用 時長度為 3*30=90 。.\{80\}grepsed.perlmawkgawk

如果您想以位元組為單位進行計數,請將區域設定修復為Cwith LC_ALL=C grep/awk/sed...

這將使所有 4 個解決方案都認為上面的行包含 122 個字元。除了perlGNU 工具之外,包含 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

相關內容