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


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

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

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

4 ответа:

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

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

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

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

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

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

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"

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

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

выход

4

Пояснения: Команда tr -cd 'e' удаляет все символы, кроме 'e', и команда wc -c подсчитывает оставшиеся символы.

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

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

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