Como posso identificar linhas em arquivos em um determinado comprimento

12

Gostaria de encontrar linhas no meu código que excedam um determinado tamanho. Meu código está em vários arquivos. O que é uma boa maneira de fazer isso?

Eu gostaria de saber os arquivos e números de linha; o conteúdo seria preferido, mas não necessário. O objetivo do exercício é descobrir como quebrar as linhas (provavelmente manualmente).

    
por Marcin 27.03.2014 / 16:03

7 respostas

13

com grep :

grep -En '.{12}' file

Para linhas com pelo menos 12 caracteres.

Com vários arquivos:

find . -type f -exec grep -En '.{12}' {} +

Algumas implementações grep , como o GNU grep , podem fazer o arquivo encontrar-se.

grep -rEn '.{12}' .

Mas tenha cuidado com links simbólicos e outros arquivos não regulares.

    
por 27.03.2014 / 17:19
13

Solução AWK

awk '{       
if (length($0) > 5)
        print $0;'} yourfile

Ou mais concisamente:

awk 'length > 5' file
    
por 27.03.2014 / 16:11
5

Como a única coisa que faltava era uma sed solution

sed -n '/^.\{6,\}/p' file
    
por 27.03.2014 / 17:10
5

Solução de bash

#!/bin/bash

count=0

while read; do
    ((++count)) 
    len=${#REPLY}
    if ((len > 80)); then
        echo "Line $count is $len characters."
    fi
done

Então, por exemplo, ./whatever.sh < input.file . Isso não inclui a nova linha subtraindo 1 de $len ; Se isso não é desejável, ou sua entrada usa finais CRLF, você deve ajustar de acordo.

    
por 27.03.2014 / 16:34
4

Com perl (por exemplo), supondo que você esteja procurando linhas com mais de 80 caracteres:

Para exibir as linhas:

$ perl -nle 'print if length > 80' your_file

Para exibir o número das linhas:

$ perl -nle 'print "$.\n" if length > 80' your_file

Ou ambos:

$ perl -nle 'print "[$.]:  $_\n" if length > 80' your_file
    
por 27.03.2014 / 16:08
1

Ruby:

ruby -lne 'puts $_ if $_.size > 5' intputfile

Python:

python -c "import sys;[ sys.stdout.write(''.join(line)) for line in sys.stdin if len(line.strip()) > 5 ]" < inputfile
    
por 27.03.2014 / 18:18
1

Aqui está outra solução bash (bash 4):

minlen=5 # minimum length of a line
mapfile -tO1 < inputfile # Map the file to the array MAPFILE (by default)
                         # Start the array at index 1
for i in "${!MAPFILE[@]}"; do
  (( ${#MAPFILE[i]} > minlen )) || unset MAPFILE[i] # Remove shorter elements
done

A matriz resultante é esparsa, portanto, os índices da matriz são mantidos. Desde que começamos em 1, os índices são os números das linhas que mantínhamos. Podemos produzir apenas esses números de linha:

printf 'Long lines found at: '
printf '%d, ' "${!MAPFILE[@]}"
echo

Ou podemos gerar as próprias linhas:

printf '%s\n' "${MAPFILE[@]}"
    
por 28.03.2014 / 02:37