Считайте вхождения char в строку с помощью Bash

Мне нужно подсчитать количество вхождений char в строке с помощью Bash.

В следующем примере, когда char является (например) t, он echo имеет правильное количество вхождений t в var, но когда символ является запятой или точкой с запятой, он выводит ноль:

var = "text,text,text,text" 
num = `expr match $var [,]`
echo "$num"

Ответ 1

Я бы использовал следующую команду awk:

string="text,text,text,text"
char=","
awk -F"${char}" '{print NF-1}' <<< "${string}"

Я разделяю строку на $char и печатаю число полученных полей минус 1.

Если ваша оболочка не поддерживает оператор <<<, используйте echo:

echo "${string}" | awk -F"${char}" '{print NF-1}'

Ответ 2

вы можете, например, удалить все остальные символы и подсчитать, что осталось, например:

var="text,text,text,text"
res="${var//[^,]}"
echo "$res"
echo "${#res}"

напечатает

,,,
3

или

tr -dc ',' <<<"$var" | awk '{ print length; }'

или

tr -dc ',' <<<"$var" | wc -c    #works, but i don't like wc.. ;)

или

awk -F, '{print NF-1}' <<<"$var"

или

grep -o ',' <<<"$var" | grep -c .

или

perl -nle 'print s/,//g' <<<"$var"

Ответ 3

Вы можете сделать это, объединив команды tr и wc. Например, чтобы подсчитать e в строке referee

echo "referee" | tr -cd 'e' | wc -c

Выход

4

Объяснения: Команда tr -cd 'e' удаляет все символы, отличные от 'e', ​​а Command wc -c подсчитывает оставшиеся символы.

Для этого решения также подходят несколько строк ввода, например, команда cat mytext.txt | tr -cd 'e' | wc -c может считать e в файле mytext.txt, даже если файл может содержать много строк.

Ответ 4

awk хорошо работает, если у вас есть сервер

var="text,text,text,text" 
num=$(echo "${var}" | awk -F, '{print NF-1}')
echo "${num}"

Ответ 5

Я бы предложил следующее:

var="any given string"
N=${#var}
G=${var//g/}
G=${#G}
(( G = N - G ))
echo "$G"

Нет вызова в любую другую программу