Считайте вхождения 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"
Нет вызова в любую другую программу