Как создавать нумеронимы в bash

Вместо того, чтобы полагаться на диспетчер окон, вызовите команду из редактора, чтобы сфокусировать окно браузера. Если вы просто хотите открыть новую вкладку, все, что вам нужно сделать с Firefox или Chromium/Chrome, — это запустить исполняемый файл браузера с нужным URL-адресом. Например, в Emacs вы можете ввести M-! firefox http://localhost/myfile.md RET.

Если вы хотите сфокусировать существующее окно, вы можете использоватьxdotool.Вы также можете заставить его вводить нажатия клавиш в окне браузера, чтобы вызвать команду перезагрузки браузера.

xdotool search --class Firefox --name 'My web page' windowactivate --sync key F5

Предполагается, что нужная вкладка активна. Firefox и Chrome не имеют простого -способа переключения вкладок из командной строки.

10
25.10.2019, 02:40
4 ответа

Другое решение awk:

awk '{l=length($1); print substr($1,1,1) l-2 substr($1,l,1)}'
  • l=length($1)-Задайте для переменной lдлину вашей строки (Предполагая, что входная строка находится в первом столбце и не содержит пробелов)
  • substr($1,1,1)-(столбец #, начальная точка, конечная точка ), поэтому напечатайте столбец 1, начиная с позиции 1, и напечатайте 1 символ.
  • l-2-Длина строки минус 2
  • substr($1,l,1)-Напечатать столбец 1, начиная с позиции l(, длину строки )и напечатать 1 символ.
10
27.01.2020, 19:59

Хотя я нахожу использование awkс пустым разделителем полей несколько «новаторским», самое простое решение, на мой взгляд, — это просто ваше небольшое расширение:

awk -F "" '{print $1 (NF-2) $NF}'

Разумеется, это работает только со словами из трех и более букв. Для обработки общего случая:

awk -F "" '{if (NF>2) print $1 (NF-2) $NF; else print $0}'

В качестве пояснения:

  • При установке разделителя полей на «пустой» с помощью -F ""ввод разбивается на поля после каждого символа, т. е. каждый символ ввода считается отдельным «полем», доступным через $nв . ] awk выражения (с n номер поля в диапазоне от 1 доNF). Кстати, руководство пользователя GNU Awk явно предоставляет такие варианты использования в качестве примеров , так что я исправляю свои предыдущие опасения по поводу использования пустой FS. Тем не менее, обратите внимание, что в руководстве говорится: «Это распространенное расширение; оно не указано в стандарте POSIX».
  • ifколичество полей (т.е. символов,здесь )больше двух, выведите первое поле/символ ($1), вычисленное выражение (NF-2), которое составляет количество символов между первым и последним, и последнее поле/символ($NF). Обратите внимание, что используемый здесь вызов printне создает пробелов между отдельными выходными токенами; это происходит только при разделении аргументов запятыми вместо пробела (см. например.Руководство пользователя GNU Awk).
  • elseпросто напечатайте все входное выражение, доступное через$0

Обратите внимание, что если мы подадим два ввода -символов, , например. at, в первом примере кода мы получили бы нежелательный (, но формально правильный вывод ), например a0t(, потому что в этом случае между первым и последним )нулевыми символами.

Также обратите внимание , и это важно, что если вы предоставляете строку, содержащую начальные или конечные пробелы для этого awkвызова, как в echo " hello" | awk <etc.>, то эти начальные/конечные пробелы будут рассматриваться как первые /последний символ, что приводит к нежелательному поведению!

17
27.01.2020, 19:59

В ksh93, bash или zsh:

numeronym() {
  (( ${#1} > 2 )) || return
  printf '%s%d%s\n' "${1:0:1}" "$(( ${#1} - 2 ))" "${1: -1:1}"
}

Это работает только с первым (параметром )путем печати первой буквы, (количества символов минус 2 )и последней буквы.

15
27.01.2020, 19:59

Портативный для многих оболочек:

a=internationalization;
if [ "${#a}" -gt 2 ]; then 
    a="${a%"${a#?}"}$((${#a}-2))${a#"${a%?}"}";
fi
printf '%s\n' "${a}"

По функции (чуть менее портативный):

numeronym() {  a="$1";
               if [ "${#1}" -gt 2 ]; then 
                    a="${a%"${a#?}"}$((${#a}-2))${a#"${a%?}"}";
               fi;
               printf '%s\n' "${a}";
            }

Назовите это как:

$ numeronym internationalization
i18n

Если это должно быть awk:

$ echo internationalization |
      awk '{ print (NF>2) ? $1 NF-2 $NF : $0 }' FS=''

i18n
5
27.01.2020, 19:59

Теги

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