Один из способов - использовать xcape .
xcape [-d] [-t timeout] [-e map-expression]
Это должно помочь:
xcape -e 'Shift_L=parenleft;Shift_R=parenright'
xcape включен как пакет для некоторых дистрибутивов.
Задержка по умолчанию составляет 500 мсек, после чего назначенный ключ не срабатывает. Его можно установить с помощью параметра -t
.
Каждое выражение-карта запускается как демон и имеет собственный PID.
С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 вместо (с более широким набором функций, чем расширенные регулярные выражения, но с другим синтаксисом ).
Обработка строки как состоящей из полей, разделенных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
программа выше делает.
с использованием Raku (ранее известного как Perl _6)
~$ echo "abcsdabcsdabc" | raku -ne '.match("abc", :global).say;'
(「abc」 「abc」 「abc」)
Выше приведены совпадения (строки -с -строкой ). Ниже указано количество совпадений (строка -по -строка):
~$ echo "abcsdabcsdabc" | raku -ne '.match("abc", :global).elems.say;'
3
Обратите внимание :аргумент :global
можно сократить до :g
.
ХТН.