Как подсчитать количество точек в строке в BASH? Например
VAR="s454-da4_sd.fs_84-df.f-sds.a_as_d.a-565sd.dasd"
# Variable VAR contains 5 dots
Как подсчитать количество точек в строке в BASH? Например
VAR="s454-da4_sd.fs_84-df.f-sds.a_as_d.a-565sd.dasd"
# Variable VAR contains 5 dots
Вы можете объединить команды grep
и wc
:
echo "string.with.dots." | grep -o "\." | wc -l
Пояснение:
grep -o # will return only matching symbols line/by/line
wc -l # will count number of lines produced by grep
Или для этой цели вы можете использовать только grep
:
echo "string.with.dots." | grep -o "\." | grep -c "\."
Решение в чистом bash
:
VAR="s454-da4_sd.fs_84-df.f-sds.a_as_d.a-565sd.dasd"
VAR_TMP="${VAR//\.}" ; echo $((${#VAR} - ${#VAR_TMP}))
или даже точно так же, как сказал chepner:
VAR="s454-da4_sd.fs_84-df.f-sds.a_as_d.a-565sd.dasd"
VAR_TMP="${VAR//[^.]}" ; echo ${#VAR_TMP}
awk
альтернатива:
echo "$VAR" | awk -F. '{ print NF - 1 }'
Вывод:
5
VAR="s454-da4_sd.fs_84-df.f-sds.a_as_d.a-565sd.dasd"
echo $VAR | tr -d -c '.' | wc -c
tr -d
удаляет заданные символы из ввода. -c
принимает обратный заданный символ. вместе, это выражение удаляет non '.' символов и подсчитывает полученную длину, используя wc
.
Временная установка IFS
, чистый Bash, никаких подпроцессов:
IFS=. VARTMP=(X${VAR}X) # avoid stripping dots
echo $(( ${#VARTMP[@]} - 1 ))
Вывод:
5
VAR="s454-da4_sd.fs_84-df.f-sds.a_as_d.a-565sd.dasd"
dot_count=$( IFS=.; set $VAR; echo $(( $# - 1 )) )
Это работает, установив разделитель полей в "." в подоболочке и задание позиционных параметров путем разбиения строки на слово. С N точками будут позиционные параметры N + 1. Мы заканчиваем вычитанием одного из числа позиционных параметров в подоболочке и эхом, которые должны быть записаны в dot_count
.