Je možné najít v souboru nějaké řádky, které přesahují 79 znaků?
V pořadí klesající rychlosti (na systému GNU v národním prostředí UTF-8 a na ASCII vstup)) podle mých testů:
grep '.\{80\}' file
Perl -nle 'print if length$_>79' file
awk 'length>79' file
sed -n '/.\{80\}/p' file
Kromě implementace Perl
¹ (nebo implementace awk
/grep
/sed
(jako mawk
nebo busybox), které nepodporují vícebajtové znaky), které počítají délku v počtu znaků (podle LC_CTYPE
nastavení národního prostředí) místo bajtů.
Pokud jsou ve vstupu bajty, které netvoří součást platných znaků (což se stává někdy, když je znaková sada národního prostředí UTF-8 a vstup je v jiném kódování), pak v závislosti na řešení a implementaci nástroje, tyto bajty bude počítat buď jako 1 znak, nebo 0 nebo neodpovídá .
.
Například řádek, který se skládá z 30 a
s 0x80 bajtů, 30 b
s, 0x81 bajtů a 30 UTF-8 é
s (kódováno jako 0xc3 0xa9), v národním prostředí UTF-8 by neodpovídalo .\{80\}
with GNU grep
/sed
(protože tento samostatný 0x80 bajt neodpovídá .
), měl by délku 30 + 1 + 30 + 1 + 2 * 30 = 122 s Perl
nebo mawk
, 3 * 30 = 90 s gawk
.
Pokud chcete počítat v bajtech, upravte národní prostředí na C
pomocí LC_ALL=C grep/awk/sed...
.
To by mělo všechna 4 řešení za to, že řádek výše obsahuje 122 znaků. Kromě nástrojů Perl
a GNU=) byste stále měli potenciální problémy pro řádky, které obsahují znaky NUL (0x0 bajtů).
¹ chování Perl
může být ovlivněno Perl_UNICODE
proměnná prostředí ačkoli
Shell přístup:
while IFS= read -r line || [ -n "$line" ];
do
[ "${#line}" -gt 79 ] && printf "%s\n" "$line"
done < input.txt
Pythonský přístup:
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
Nebo jako krátký skript pro čitelnost:
#!/usr/bin/env python
import sys
with open(sys.argv[1]) as f:
for line in f:
if len(line) > 79:
print line.strip()
Pokud bychom chtěli vyloučit znak nového řádku \n
Z výpočtů, můžeme udělat if len(line) > 79
být if len(line.strip()) > 79
Vedlejší poznámka: toto je Python 2,7 syntaxe.) Použijte print()
pro Python 3)