Сawk
:
awk 'BEGIN{print gsub(ARGV[2], "&", ARGV[1])}' abcsdabcsdabc abc
Обратите внимание, что шаблон (здесьabc
)принимается awk
как расширенное регулярное выражение (, как будто используется grep -E
/egrep
).
Такой синтаксис позволяет и теме, и регулярному выражению содержать несколько строк. Мы также избегаем обычных проблем, связанных с echo
, которые не могут выводить произвольные данные .
Использовать perl
регулярные выражения (, подобные GNU grep -P
's):
perl -le 'print scalar (() = $ARGV[0] =~ m{$ARGV[1]}g)' -- abcsdabcsdabc abc
(обратите внимание, однако, что аргументы не интерпретируются как текст в соответствии с кодировкой локали. Например, в локали UTF -8 с é
и .
в качестве аргументов он будет сообщать 2 (байта )вместо 1 (символа )).
С помощью zsh
вы можете сделать:
occurrences() {
set -o localoptions -o extendedglob
local n=0
: ${1//(#m)$2/$((++n))}
echo $n
}
occurrences abcsdabcsdabc abc
Здесь второй аргумент(abc
)интерпретируется как фиксированная строка; замените $2
на $~2
, чтобы он интерпретировался как расширенный шаблон zsh glob вместо (с более широким набором функций, чем расширенные регулярные выражения, но с другим синтаксисом ).
Я бы предположил, что вы непреднамеренно изменили схему редактирования строк со стандартного «emacs» на «vi».
Вы можете сбросить это обратно с помощью
set -o emacs
Или верните его в режим vi
с помощью
set -o vi