Комбинация комментария Квазимодо и примера Фредди в нижнем регистре:
$ sign=c
$ sub='mechanic Cup cat'
A tr
+ wc
решение, если ${sign}
- один символ.
Подсчитайте, сколько раз ${sign}
отображается в ${sub}
, игнорируя регистр:
$ tr -cd [${sign,,}] <<< ${sub,,} | wc -c
4
Где:
${sign,,}
& {sub,,}
- преобразовать во все строчные буквы tr -cd [...]
- найти все символы, перечисленные в скобках ([]
), -d
говорит об удалении / удалении указанных символов, в то время как -c
говорит о том, чтобы взять дополнение (ie, удалить все но символы в скобках), поэтому -cp [${sign,,]
говорит, что нужно удалить все, кроме символа, хранящегося в ${sign}
<<< ....
- здесь строка (позволяет передавать переменную / строку в качестве аргумента tr
wc -c
подсчитать количество символов
ПРИМЕЧАНИЕ. Это работает, только если ${sign}
содержит один символ.
A sed
решение, которое должно работать независимо от количества символов в ${sign}
.
$ sub='mechanic Cup cat'
Сначала мы вставляем символ новой строки перед или в каждом случае ${sign,,}
:
$ sign=c
$ sed "s/\(${sign,,}\)/\n\1/g" <<< ${sub,,}
me
chani
c
cup
cat
$ sign=cup
$ sed "s/\(${sign,,}\)/\n\1/g" <<< ${sub,,} | tail +2
mechanic
cup cat
Где:
\(${sign,,}\)
- найти шаблон, соответствующий ${sign}
(все строчные буквы), и присвоить позиции 1
\n\1
- разместить новую строку (\n
) в потоке непосредственно перед нашим шаблоном в позиции 1
В этот момент нам просто нужны строки, начинающиеся с ${sign,,}
, где в игру вступает tail +2
(ie, отображать строки от 2 до n):
$ sign=c
$ sed "s/\(${sign,,}\)/\n\1/g" <<< ${sub,,} | tail +2
chani
c
cup
cat
$ sign=cup
$ sed "s/\(${sign,,}\)/\n\1/g" <<< ${sub,,} | tail +2
cup cat
И теперь мы направляемся к wc -l
, чтобы получить количество строк (ie , посчитайте, сколько раз ${sign}
отображается в ${sub}
- без учета регистра):
$ sign=c
$ sed "s/\(${sign,,}\)/\n\1/g" <<< ${sub,,} | tail +2 | wc -l
4
$ sign=cup
$ sed "s/\(${sign,,}\)/\n\1/g" <<< ${sub,,} | tail +2 | wc -l
1