Подсчитайте вхождения символа в строку с помощью Bash
мне нужно посчитать количество вхождений символа в строку С помощью Bash.
в следующем примере, когда Чара (пример) t
, это echo
s правильное количество вхождений t
in var
, но когда символ запятая или точка с запятой, он выводит ноль:
var = "text,text,text,text"
num = `expr match $var [,]`
echo "$num"
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
, даже думал, что файл может содержать много русло.