Como contar espaços no texto?

Aug 27 2020

No exemplo a seguir, existem 4 espaços antes de inet.

wolf@linux:~$ ip address show eth0 | grep 'inet ' inet 10.10.10.10/24 brd 10.10.10.255 scope global dynamic eth0 wolf@linux:~$ 

Como faço para contar o número de espaços como este exemplo.

Esta amostra é fácil, pois tem apenas 4 espaços.

E se tiver mais do que isso? Centenas, milhares?

Existe uma maneira fácil de fazer isso?

Respostas

7 StephenKitt Aug 27 2020 at 21:41

Você pode usar trpara excluir tudo o que não é o personagem que você está interessado, wcpara contar os caracteres restantes:

ip address show eth0 | grep 'inet ' | tr -d -c ' ' | wc -m

Isso se adapta bem a grandes quantidades de texto, tré muito eficiente.

Observe, no entanto, que com algumas implementações trincluindo GNU tr, isso só funciona corretamente para caracteres de byte único (como o caractere de espaço).

Se você quiser apenas contar espaços à esquerda, precisará de algo um pouco mais poderoso do que tr:

ip address show eth0 | grep 'inet ' | sed 's/[^ ].*$//' | tr -d '\n' | wc -m

Isso exclui todas as partes de cada linha que não são espaços à esquerda e, em seguida, exclui novas linhas e contagens.

Consulte Como contar o número de um caractere específico em cada linha? se você estiver interessado em contagens por linha.

6 StéphaneChazelas Aug 27 2020 at 21:52

Para contar o número de caracteres de espaço no início de cada linha, você pode fazer:

awk -F '[^ ].*' '{print length($1)}'

Que imprime o comprimento (em número de caracteres) do primeiro campo, onde os campos são separados por qualquer sequência de caracteres começando com um não-espaço.

Para relatar a quantidade máxima de espaço em branco encontrada no início de qualquer linha da entrada (o recuo máximo), com GNU wc:

sed 's/[^[:blank:]].*//' | wc -L

Isso relata essa quantidade de espaço em branco em termos de largura de exibição em um dispositivo de exibição em que as paradas de tabulação são separadas por 8 colunas:

$ printf '\tfoo\n' | sed 's/[^[:blank:]].*//' | wc -L
8
$ printf '\u3000foo\n' | sed 's/[^[:blank:]].*//' | wc -L
2

O caractere U+3000 (o caractere de espaço ideográfico, classificado como em branco em minha localidade) é um caractere de largura dupla codificado em 3 bytes em UTF-8.

Se você preferir que esse comprimento máximo seja relatado em termos de número de caracteres:

sed 's/[^[:blank:]].*//;s/./x/g' | wc -L

( s/./x/gconverte todos os caracteres em cada linha para a xqual sabemos que tem uma largura de exibição de 1).

Ou em termos de número de bytes:

sed 's/[^[:blank:]].*//' |
  LC_ALL=C tr -c '\n' '[x*]' | # convert each byte other than newline to x
  wc -L
3 Quasímodo Aug 27 2020 at 21:54
  • Imprima o número de espaços à esquerda:

    awk '{print match($0,/[^ ]|$/)-1}' file
    

    match($0,/[^ ]|$/)corresponde ao primeiro não espaço ( [^ ]) ou ao fim de linha ( $) e retorna sua posição.

  • Imprima o número de espaços:

    awk -F '[ ]' '{print (NF?NF-1:0)}' file
    

    -F '[ ]'define o separador de campo como espaço. NFé o número de campos. A expressão ternária significa: "Se NF não for 0, imprima NF-1, senão imprima 0". Isso ocorre porque NF é 0 se a linha estiver vazia.

2 ron Aug 27 2020 at 21:50

parece que o que você realmente quer é como excluir o espaço em branco principal

muitas maneiras de fazer isso, supondo que você queira fazer isso no bash, encontrei isso em

https://www.cyberciti.biz/tips/delete-leading-spaces-from-front-of-each-word.html

echo "     This is a test"

# remove leading white space on the output

echo "     This is a test" | sed -e 's/^[ \t]*//'

então no seu caso você poderia fazer

ip address show eth0 | grep 'inet ' | sed -e 's/^[ \t]*//'

confira também Como faço para aparar espaços em branco à esquerda e à direita de cada linha de alguma saída?

PraveenKumarBS Aug 28 2020 at 01:26

peguei o exemplo abaixo

`echo "      praveen"| grep -o "^ *"| awk '{print length($0)}'`6

output

6

Pitão

>>> a="      praveen"
>>> import re
>>> k=re.compile(r'^ *')
>>> m=re.search(k,a)
>>> print len(m.group())
6
>>> 
RakeshSharma Aug 28 2020 at 15:11
$ ip address show eth0 \
| grep -oP '^\h*(?=inet\h)' \
| wc -m;

Isso usa o GNU grep com o modo PCRE e procura por qualquer espaço em branco horizontal principal, também conhecido como [[:blank :]], seguido por inet e outro em branco. Em seguida, alimentamos wc para obter uma contagem de caracteres.

Usando gnu awk com a variável FPATH definida para uma série de espaços em branco.

$ ... |
 gawk -v FPAT='\\s*' '$0=length($1)""'

Usando a compactação de lista python, também podemos alimentar o/p do grep para obter a contagem.

$ ... | python3 -c 'import sys;print(*[len(l)-len(l.lstrip()) for l in sys.stdin],sep="\n")'

Também podemos alimentar a saída do grep para o perl.

$ ..... |
  perl -F'\H' -pE '$_=$F[0]=~y///c'

Aqui dividimos o registro em espaço em branco não horizontal e depois substituímos cada caractere no primeiro campo, em um contexto escalar retorna as traduções feitas. Atribua-o ao registro e faça com que a opção -p seja impressa automaticamente.