Обработка строки как состоящей из полей, разделенныхabc
:
$ echo abcsdabcsdabc | awk -F 'abc' '{ print (length > 0 ? NF - 1 : 0) }'
3
Количество вхождений разделителя abc
равно 1 минус количество полей, которые он ограничивает.
$ echo abcsdabcsdabc | awk '{ n=0; while (sub("abc", "xxx")) n++; print n }'
3
Это заменяет подстроку abc
из строки на xxx
и подсчитывает, сколько раз это делается, а затем выводит это число. n=0
не нужен, если есть только одна строка ввода.
Функция gsub()
в awk
возвращает количество сделанных замен, поэтому приведенное выше можно упростить до
$ echo abcsdabcsdabc | awk '{ print gsub("abc", "xxx") }'
3
В bash
можно сделать то же самое, что и в той awk
программе, которая используетsub()
:
string=abcsdabcsdabc
n=0
while [[ $string == *abc* ]]; do
n=$(( n+1 ))
string=${string/abc/xxx} # replace first occurrence of "abc" with "xxx"
done
printf '%d\n' "$n"
При этом используется цикл while
для замены подстроки abc
из значения в $string
на xxx
до тех пор, пока в $string
не будет найдено больше вхождений abc
, точно так же, как второй awk
программа выше делает.