Obtém o número de caracteres de espaços em uma string?

1

Como posso verificar quantos espaços em branco ('', \t ) existem na primeira linha de um arquivo?

    
por Luigi T. 02.12.2015 / 16:57

5 respostas

4

Um caminho direto seria selecionar apenas a primeira linha, soltar caracteres que não são witespace e conta quantos caracteres são esquerda:

head -n 1 | tr -cd ' \t' | wc -c
    
por 02.12.2015 / 17:10
3
awk '{print gsub("[ \t]",""); exit}' < file

Ou para contar qualquer espaço em branco (caracteres de espaçamento horizontal), não apenas espaço e tabulação:

awk '{print gsub("[[:blank:]]",""); exit}' < file
    
por 02.12.2015 / 21:33
3

Você pode usar o GNU sed para substituir a combinação head|tr (aqui assumindo que POSIXLY_CORRECT não está no ambiente):

sed '1s/[^ \t]//g' |wc -c

Observação: o sed sempre imprimirá uma nova linha, então a contagem incluirá a nova linha em si. Como isso funciona : No sed, você pode dar ao comando s/// um intervalo de endereços, que aqui é apenas a primeira linha. Substitua globalmente qualquer espaço não nulo por nul e envie o resultado para wc , o que conta os caracteres.

É possível, mas feio, descobrir uma versão pura que faz a contagem.

Uma versão perl também é simples:

perl -lne 's/[^ \t]//g;print length($_);last'

O princípio é o mesmo. A opção -l gera uma nova linha à direita. A opção -n envolve o script em um loop gigante de readline. E last termina esse loop.

A solução awk do Stéphane me lembrou que você pode fazer isso também com o perl:

perl -lne 'print s/[[:space:]]]//g;last'

Ou substitua-o por [[:blank:]] para incluir a nova linha e outros caracteres não imprimíveis.

    
por 02.12.2015 / 17:50
0
perl -nE '$n = tr/ / /; say $n; exit' file
    
por 02.12.2015 / 17:46
0

(funciona com a maioria dos shells) :

IFS=; <file \                       
read -r IFS                         # read 1 line into $IFS
set -- $IFS                         # split while eliding $IFS whitespace
echo "$((${#IFS}-$#))"              # $IFS len less $IFS field count
    
por 02.12.2015 / 21:02