Encontre 10 “main ()” nas primeiras 10 linhas em arquivos regulares

0

Tentando escrever um comando que imprima esses parâmetros, que correspondem a arquivos regulares contendo texto “main ()” em qualquer uma das suas primeiras 10 linhas.
O que devo digitalizar todos os arquivos e procurar 10 primeiras linhas?

    
por Zhyhalo Oleksandr 28.06.2017 / 12:12

3 respostas

1

Você pode se beneficiar do GNU grep com suas regexes Perl também. Isto irá mostrar a linha contendo a string main () em qualquer lugar nas 10 primeiras linhas do arquivo de entrada.

A opção -z permite que o arquivo seja sugado e tratado como uma grande cadeia (contanto que não contenha caracteres NUL) na qual o grep deve operar. O -P ativa o modo Perl do grep, -o mostra a parte correspondente, -h ocultará o nome do arquivo ao lado da linha correspondente e -l listará apenas o nome do arquivo.

Caso você deseje o nome do arquivo e a linha correspondente:

grep -HPoz  '\A(.*\n){0,9}\K[^\n]*main\(\)[^\n]*\n' file.txt

apenas linha correspondente:

grep -hPoz '\A(.*\n){0,9}\K[^\n]*main\(\)[^\n]*\n' file.txt

(o -h só é necessário quando há mais de um arquivo)

apenas nome do arquivo:

grep -Pozl '\A(.*\n){0,9}\K[^\n]*main\(\)[^\n]*\n' file.txt

Para executar o diretório atual, mas sem recursão: (ofc, as opções do grep precisam ser fornecidas de acordo com os requisitos mostrados acima)

find . ! -name . -prune -type f \
  -exec grep -HPoz '\A(.*\n){0,9}\K[^\n]*main\(\)[^\n]*\n' {} +
    
por 03.07.2017 / 07:45
1

Se você quiser pesquisar as dez primeiras linhas de vários arquivos para um padrão, faça:

for file in *; do 
    head -n 10 "$file" | grep -F 'main()' 
done

Isso imprimirá as linhas correspondentes. Para imprimir a linha correspondente e o nome do arquivo, use:

for file in *; do 
    q=$(head -n 10 "$file" | grep -F 'main()')
    [ -z "$q" ] || printf '%s : %s\n' "$file" "$q"
done

E para imprimir apenas os nomes dos arquivos e não a linha correspondente:

for file in *; do 
    head -n 10 "$file" | grep -qF 'main()' && printf '%s\n' "$file" 
done
    
por 28.06.2017 / 12:20
1

Eu usaria awk :

awk 'FNR <= 10 && index($0, "main()") {print FILENAME ":", $0}' ./*.c
    
por 03.07.2017 / 08:19