Como encontrar o número de palavras separadas por `_`?

0

Eu quero fazer um comando Unix que leia uma string e conte quantas palavras ela contém. No meu caso, as palavras são separadas por um _caractere (sublinhado), não por espaços.

Por exemplo, TABLE_PERSONcontém duas palavras, portanto, o comando deve imprimir "2".

Como eu posso fazer isso?

user316467
fonte
Olá, usuário316467. Editei sua pergunta para remover material supérfluo não diretamente relacionado à pergunta que você está fazendo. Se você acha que minha edição mudou a intenção da sua pergunta, fique à vontade para reverter (clique no link "editado" e depois clique em "reverter" ao lado da revisão para a qual deseja reverter) ou editar mais.
um CVn

Respostas:

2

Se sua sequência não contiver espaços, você poderá substituí-los _por espaços (por tr( traduzir caractere ) ou sed( editor de fluxo )) e usar wc( contagem de palavras ) para contar as palavras:

 $ echo TABLE_PERSON | tr '_' ' ' | wc -w
 2

ou

 $ echo TABLE_PERSON | sed 's/_/ /' | wc -w
 2

se sua string contiver espaços que não precisam ser considerados como um separador (por exemplo, se "TABLE_PERSON 2"contar como duas palavras separadas por _: TABLEe PERSON 2), você poderá primeiro remover os espaços com qualquer caractere (por exemplo, -) e usar o mesmo comando:

 $ echo 'TABLE_PERSON 2' | tr ' ' '-' | tr '_' ' ' | wc -w
 2
Matteo
fonte
Olá, @ user316467. Se você achou esta resposta útil para responder sua pergunta, faça um voto positivo clicando na seta para cima na coluna da esquerda. Se você acha que esta resposta atende adequadamente a todas as suas preocupações ou foi fundamental para resolver seu problema, considere aceitá-la clicando no contorno da marca de seleção na coluna à esquerda, abaixo das setas de votação. A aceitação de uma resposta informa à comunidade que você acha que seu problema foi resolvido e é a maneira mais comum de agradecer no Superusuário e na rede Stack Exchange.
um CVn
0

Muitas maneiras, a maioria das quais são fáceis de descobrir:

#! / bin / sh
n = $ (tr-dc "_" | wc-c)
eco $ ((n + 1))
#! / bin / sh
tr "_" "x" | wc -w
#! / usr / bin / env bash
read -r string
len1 = $ {# string}
string = $ {string // _ /}
len2 = $ {# string}
eco $ ((len1-len2 + 1))
#! / usr / bin / env perl
print (divisão escalar / _ /, <STDIN>). "\ n";
#! / usr / bin / env python3
sys de importação
print (len (sys.stdin.readline (). split ("_"))))
#! / usr / bin / env ruby
coloca gets.split (/ _ /). length
#include <stdio.h>
int main (vazio) {
    int c, n = 1;
    para (;;) {
        c = getchar ();
        if (c == EOF || c == '\ n')
            pausa;
        caso contrário, se (c == '_')
            n ++;
    }
    printf ("% u \ n", n);
    retornar 0;
}
gravidade
fonte