Как получить различные результаты регулярного выражения (используя grep?) В переменные?

Я сопоставил F12 для очистки экрана в каждой из следующих оболочек: bash, csh и fish shell . Моя команда отличается от всех предыдущих тем, что сохраняет все, что вы уже набрали в текущей строке.
(Примечание: все приведенные ниже конфигурации зависят от терминала, но я надеюсь, что они будут работать практически везде)

bash

Откройте файл ~/.inputrc и вставьте следующую строку:

"\e[24~": "\Ck \C-uecho -ne '\\ec\\e[3J'; history -d $((HISTCMD-1 ))\n\Cy\C-?"

Чтобы получить новую привязку клавиш, откройте новый терминал или введите Ctrl+X, затем Ctrl+R, чтобы перезагрузите файл .inputrc в текущем терминале.

Пояснение
Файл ~/.inputrc управляет привязками клавиш терминала bash.

О строке:

  1. Первая часть строки, "\e[24~", отображает клавишу F12.
  2. C-k (Ctrl+X) очищает список уничтожений (память bash для копирования и вставки).
  3. Пробел позволяет избежать звукового сигнала в следующей команде.
  4. C-u (Ctrl+U) отправляет текущую строку в список уничтожений и стирает ее.
  5. The echo -ne '\\ec\\e[3J'; history -d $((HISTCMD-1))\n отправляет на терминал две сгруппированные команды. Они разделены ; и заканчиваются \n.
    • echo -ne '\\ec\\e[3J' очищает экран.
    • history -d $((HISTCMD-1)) предотвращает попадание этих двух команд в историю.
  6. Команда C-y (Ctrl+Y) вставляет список уничтожений, сохраненный командой C-u.
  7. C-? (Ctrl+?) эквивалентно Backspace и удаляет пробел, вставленный на шаге 3 выше.

Ссылки:

csh

Введите команду ниже.
bindkey -c "^[[24~" "echo -ne '\ec\e[3J'"
Его также можно вставить в ваш файл .cshrc для загрузки привязки клавиш к каждому новому терминалу.
(Да, это намного проще, чем в bash)

fish shell

Введите команду ниже.
bind -k f12 "echo -ne '\ec\e[3J'; commandline -f repaint"
Вы можете отредактировать и сохранить функцию fish_user_key_bindings для загрузки привязки клавиш к каждому новому Терминал.
(Да, это гораздо проще, чем в bash)

0
17.09.2017, 16:04
3 ответа

Использовать сопоставление регулярных выражений bash и получить доступ к встроенному массиву BASH _REMATCH

s="hello world 15 42"
re='.*([0-9]+) ([0-9-]+)'
if [[ $s =~ $re ]]; then
    for key in "${!BASH_REMATCH[@]}"; do 
        printf "%s\t%s\n" "$key" "${BASH_REMATCH[$key]}"
    done
fi
0   hello world 15 42
1   5
2   42
3
28.01.2020, 02:19

Я бы использовал массив:

myArray=($(echo "hello world 15 42" | egrep -o '([0-9]+)'))

Доступ к первой подстроке:

echo ${myArray[0]}
15

...и второй:

echo ${myArray[1]}
42
1
28.01.2020, 02:19
> greparray=($(echo "hello world 15 42" | grep -Eo "[0-9]+ [0-9]+"))
> echo ${greparray[1]}
42
2
28.01.2020, 02:19

Теги

Похожие вопросы