É possível encontrar linhas em um arquivo que exceda 79 caracteres?
fonte
Em ordem decrescente de velocidade (em um sistema GNU em um código de idioma UTF-8 e em entrada ASCII) de acordo com meus testes:
grep '.\{80\}' file
perl -nle 'print if length$_>79' file
awk 'length>79' file
sed -n '/.\{80\}/p' file
Exceto pelo perl
¹ (ou para awk
/ grep
/ sed
implementações (como mawk
ou ocupado) que não suporta caracteres de vários bytes), que conta o comprimento em termos de número de caracteres (de acordo com a LC_CTYPE
configuração do código do idioma) em vez de bytes .
Se houver bytes na entrada que não fazem parte de caracteres válidos (o que acontece algumas vezes quando o conjunto de caracteres do código do idioma é UTF-8 e a entrada está em uma codificação diferente), dependendo da implementação da solução e da ferramenta, esses bytes contará como 1 caractere ou 0 ou não corresponderá .
.
Por exemplo, uma linha que consiste em 30 a
sa 0x80 byte, 30 b
s, um 0x81 byte e 30 UTF-8 é
s (codificado como 0xc3 0xa9), em um código de idioma UTF-8 não corresponderia .\{80\}
ao GNU grep
/ sed
(como aquele 0x80 byte autônomo não corresponde .
), teria um comprimento de 30 + 1 + 30 + 1 + 2 * 30 = 122 com perl
ou mawk
3 * 30 = 90 com gawk
.
Se você deseja contar em termos de bytes, corrija o código do idioma C
com LC_ALL=C grep/awk/sed...
.
Isso teria todas as quatro soluções, considerando que a linha acima contém 122 caracteres. Exceto nas perl
ferramentas GNU, você ainda teria problemas em potencial nas linhas que contêm caracteres NUL (0x0 byte).
¹ o perl
comportamento pode ser afetado pela PERL_UNICODE
variável de ambiente
awk
pode se aproximar se você soltar($0)
, o que está implícito de qualquer maneira;).^
, é um pouco mais rápido: por exemplogrep '^.\{80\}' file
.grep '^.\{1000\}' file
retornosgrep: invalid repetition count(s)
, enquantoawk 'length>1000' file
bem sucedido.)Abordagem Shell:
Abordagem Python:
Ou como um script curto para facilitar a leitura:
Se quiséssemos excluir caractere de nova linha
\n
a partir de cálculos, podemos fazerif len(line) > 79
serif len(line.strip()) > 79
Nota lateral: esta é a sintaxe do Python 2.7. Use
print()
para Python 3fonte