是否可以找到文件中超過 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 ,使用 時長度為 3*30=90 。.\{80\}
grep
sed
.
perl
mawk
gawk
如果您想以位元組為單位進行計數,請將區域設定修復為C
with LC_ALL=C grep/awk/sed...
。
這將使所有 4 個解決方案都認為上面的行包含 122 個字元。除了perl
GNU 工具之外,包含 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