Вместо того, чтобы полагаться на диспетчер окон, вызовите команду из редактора, чтобы сфокусировать окно браузера. Если вы просто хотите открыть новую вкладку, все, что вам нужно сделать с 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 не имеют простого -способа переключения вкладок из командной строки.
Другое решение 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
-Длина строки минус 2substr($1,l,1)
-Напечатать столбец 1, начиная с позиции l
(, длину строки )и напечатать 1 символ. Хотя я нахожу использование 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.>
, то эти начальные/конечные пробелы будут рассматриваться как первые /последний символ, что приводит к нежелательному поведению!
В ksh93, bash или zsh:
numeronym() {
(( ${#1} > 2 )) || return
printf '%s%d%s\n' "${1:0:1}" "$(( ${#1} - 2 ))" "${1: -1:1}"
}
Это работает только с первым (параметром )путем печати первой буквы, (количества символов минус 2 )и последней буквы.
Портативный для многих оболочек:
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