Я хочу сделать команду Unix, которая читает строку и считает, сколько слов в ней содержится. В моем случае слова разделяются символом _ (подчеркивание), а не пробелами.

Например, TABLE_PERSON содержит два слова, поэтому команда должна вывести "2".

Как я могу это сделать?

2 ответа2

2

Если ваша строка не содержит пробелов, вы можете заменить _ пробелом (с tr (символ перевода) или sed (редактор потока)) и использовать wc (количество слов) для подсчета слов:

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

или же

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

если ваша строка содержит пробелы, которые не должны рассматриваться как разделитель (например, если "TABLE_PERSON 2" считается двумя словами, разделенными _: TABLE и PERSON 2), вы можете сначала удалить пробелы с любым символом (например, -) и используйте ту же команду:

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

Множество способов, большинство из которых легко понять:

#!/bin/sh
n=$(tr -dc "_" | wc -c)
echo $((n+1))
#!/bin/sh
tr " _" "x " | wc -w
#!/usr/bin/env bash
read -r string
len1=${#string}
string=${string//_/}
len2=${#string}
echo $((len1-len2+1))
#!/usr/bin/env perl
print (scalar split /_/, <STDIN&gt)."\n";
#!/usr/bin/env python3
import sys
print(len(sys.stdin.readline().split("_")))
#!/usr/bin/env ruby
puts gets.split(/_/).length
#include <stdio.h>
int main(void) {
    int c, n = 1;
    for (;;) {
        c = getchar();
        if (c == EOF || c == '\n')
            break;
        else if (c == '_')
            n++;
    }
    printf("%u\n", n);
    return 0;
}

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .