Как сделать Caps Lock из кнопки поиска?

Ваш скрипт считывает весь файл в переменную, а затем перебирает значение этой переменной. Это имеет три проблемы:

  1. В самом общем случае размер входного файла может быть неизвестен, а это означает, что при некоторых обстоятельствах переменная может стать очень большой.
  2. Циклическое перебор значения переменной без кавычек будет основываться на том, что оболочка разбивает данные на пробелы (, табуляции и символы новой строки ). Если данные содержат какие-либо пробелы, кроме символов новой строки, цикл, скорее всего, сделает что-то не так.
  3. Оболочка выполнит подстановку имени файла для значений переменной без кавычек, прежде чем зациклится на ней. Это означает, что если данные содержат подстановочные шаблоны, такие как *или [...], они будут сопоставляться с существующими именами файлов.

В этом ответе используется тот факт, что используемые временные метки разумны в том смысле, что более поздние временные метки сортируются после более ранних (по крайней мере в локали POSIX ).

#!/bin/bash

while IFS= read -r line; do
    timestamp=${line%:*}            # Remove ":ERR" at the end
    timestamp=${timestamp#*:*:}     # Remove numbers from start ("0001:3002:")
    if [[ "$timestamp" > "$1" ]]; then
        # According to the current locale, the timestamp in "$timestamp"
        # sorts after the timestamp in "$1".
        printf "Greater: %s\n" "$line"
    fi
done 

Этот скрипт будет принимать отметку времени в том же формате, что и в файле, в качестве единственного аргумента. Он перебирает содержимое файла fileи для каждой строки анализирует метку времени и сравнивает ее с меткой времени в командной строке. Сравнение выполняется с использованием оператора >в bashи будет истинным, если временная метка в файле сортируется (лексикографически )после данной временной метки в текущей локали. Если сравнение истинно, печатается строка из файла.

Две отдельные подстановки для извлечения метки времени из строки путем удаления частей конца и начала строки можно заменить на

timestamp=$( cut -d ':' -f 3,4 <<<"$line" )

но это будет работать медленнее, так как вызывает внешнюю утилиту.

Тестирование:

$ bash script.sh '2018/07/16:12.36.00'
Greater: 0008:3002:2018/07/16:12.36.02:ERR
Greater: 0009:3002:2018/07/16:12.36.15:ERR

Если вы хотите вывести только метку времени из файла, а не исходную строку, измените "$line"на "$timestamp"в команде printf.

В этом случае вы также можете ускорить работу, выполнив такой цикл:

#!/bin/bash

cut -d ':' -f 3,4 file |
while IFS= read -r timestamp; do
    if [[ "$timestamp" > "$1" ]]; then
        # According to the current locale, the timestamp in "$timestamp"
        # sorts after the timestamp in "$1".
        printf "Greater: %s\n" "$timestamp"
    fi
done

Здесь мы используем cutдля получения 3-го и 4-го:-столбцов с разделителями из файла (отметки времени ), что означает, что нам не нужно выполнять какой-либо анализ исходных строк.

Связанные:

0
02.08.2020, 00:37
1 ответ

Непонятно, при чем тут «ubuntu Mate».

Для нормальной работы Chromebook нажмите в правом нижнем углу экрана, где находятся часы, затем нажмите на шестеренку, чтобы получить доступ к «настройкам». Оттуда выберите «устройство», а затем «клавиатура». Там вам представлены варианты того, что делают различные клавиши, включая «поиск», «ctrl», «alt», «backspace» и «escape». Один из вариантов - использовать "поиск" как "caps lock".

Изменить :ОП пояснил, что теперь это «как обычный ноутбук», поэтому применяются обычные методы.

Из памяти, учитывая, что OP говорит, что код ключа, сгенерированный ключом поиска, равен 125 (, возможно, найденный из программы xev)

xmodmap -e 'keycode 125 = Caps_Lock'
xmodmap -e 'add lock = Caps_Lock'

должен установить клавишу Caps_Lock, а затем заставить клавишу Caps_Lockфункционировать как заглавная буква.

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

0
18.03.2021, 23:15

Теги

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