Получение в переменных оболочки аргументы после команды (между скобками)

В зависимости от дистрибутива для раскладок клавиатуры команда

loadkeys <path/to/file>

loadkey /lib/kbd/keymaps/i386/qwerty/pt_PT.map.gz

Если я помню правильно. Также проверьте страницу справочника на loadkeys, если Вы хотите присвоить определенные ключи к определенному поведению.

5
13.04.2017, 15:36
2 ответа

Я бы хотел найти обычный шаблон для включения в скрипт оболочки, так что что n переменных будут содержать n аргументов

Далее создается shell-массив arglist, который содержит каждый из аргументов:

$ readarray -t arglist < <(echo "\command{arg1,
    arg2 ,
    arg3
    }" | sed -n '/\\command/{ :a;/}/!{N;b a}; s/\\command{//; s/[ \n}]//g; s/,/\n/g; p}')

Используя утверждение declare, мы видим, что это сработало:

$ declare -p arglist
declare -a arglist='([0]="arg1" [1]="arg2" [2]="arg3")'

Вот еще один пример с аргументами в одной строке:

$ readarray -t arglist < <(echo "\command{arg1, arg2, arg3, arg4}"  | sed -n '/\\command/{ :a;/}/!{N;b a}; s/\\command{//; s/[ \n}]//g; s/,/\n/g; p}')

Снова работает:

$ declare -p arglist
declare -a arglist='([0]="arg1" [1]="arg2" [2]="arg3" [3]="arg4")'

Обратите внимание, что пробел в < <( является существенным. Мы перенаправляем входные данные из подстановки процесса. Без пробела, bash попробует что-то совершенно другое.

Как это работает

Команда sed немного неуловима. Давайте посмотрим на нее по кусочку за раз:

  • -n

    Не печатать строки, если не задан явный вопрос.

  • /\\command/{...}

    Если мы находим строку, содержащую \command, то выполняем следующие команды в фигурных скобках:

  • :a;/}/!{N;b a}

    Это считывание строк в буфер паттерна до тех пор, пока мы не найдем строку, содержащую }. Таким образом, мы получаем всю команду сразу.

  • s/\\command{//

    Удалить строку \command{.

  • s/[ \n}]//g

    Удалить все пробелы, закрывающие скобки и новые строки.

  • s/,/\n/g

    Замените запятые на новые строки. Когда это сделано, каждый аргумент находится в отдельной строке, что и нужно readarray.

  • p

    Печать.

5
27.01.2020, 20:36

С Perl :

perl -l -0777 -ne '
  $n = 0;
  for (/\\command\{\s*(.*?)\s*\}/sg) {
    $n++;
    $i = 0;
    for $arg (split /\s*,\s*/, $_) {
      $arg =~ s/'\''/$&\\$&$&/g;
      print "arg${n}[$i]='\''$arg'\''";
      $i++;
    }
  }
  print "n=$n"' the-file

выводят что-то вроде:

arg1[0]='arg1'
arg1[1]='arg2'
arg1[2]='arg3'
n=1

, который вы могли бы оценить как:

eval "$(perl ...)"

Для создания $ arg1 , $ arg2 ... Массивы для каждого из \ команду s.

3
27.01.2020, 20:36

Теги

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