Преобразование этого регулярного выражения в дружественное для sed

Интересно, что при поиске по вариантам слов ошибки, включая Lenovo, Alps и Ultranav, я нашел статью, предлагающую параметры ядра в сообщении на вики Arch Linux libinput

Touchpad not detected at all

Notes: Not a libinput issue. An explanation of the parameters is linked in Touchpad_Synaptics#No_Multi-touch_in_some_Elantech_touchpads, which is much better than saying "try some of these".

If a touchpad device is not detected and shown as a device at all, a possible solution might be using one or more of these kernel parameters.

i8042.noloop i8042.nomux i8042.nopnp i8042.reset

Затем я сделал несколько тестов и обнаружил, что в моем случае достаточно добавить параметр ядра i8042.resetв GRUB_CMDLINE_LINUX_DEFAULTв файле /etc/default/grubи запустить:

update-grub2

После этого я вынул батарею, чтобы попытаться воспроизвести ошибку. После того, как машина вышла из строя и перезагрузила Linux, внутренняя мышь Ultranav/Elantech уже была распознана и сначала работала, без необходимости предварительной загрузки Windows 10.

Я бы сказал, что это ошибка ядра.

Как и другие ноутбуки, Lenovo Thinkpad необходимо добавить в список сброса устройств i8042 в ядре Linux, где есть список семейных машин, которым требуется сброс набора микросхем i8042, чтобы постоянно обнаруживать сенсорную панель Elantech.

Я обнаружил это более позднее требование после обнаружения этих записей об ошибках Ввод :i8042 -добавить Lenovo LaVie Z в список сброса i8042 и Ввод :i8042 :добавить Lenovo Список сброса ThinkPad L460 на i8042

Судя по визуальному осмотру исходного кода ядра Linux, исходный код для добавления Lenovo ThinkPad E560 в список сброса i8042 также отсутствует в последних исходных кодах ядра 4.19 -rc2.

Поэтому для его добавления я написал простой diff/patch, который можно использовать вместо использования параметра ядра i8042.reset в grub:

--- drivers/input/serio/i8042-x86ia64io.h.old   2018-09-06 04:53:36.460003164 +0100
+++ drivers/input/serio/i8042-x86ia64io.h   2018-09-06 04:57:16.833465129 +0100
@@ -655,6 +655,14 @@
            DMI_MATCH(DMI_PRODUCT_NAME, "P65xRP"),
        },
    },
+   {
+                /* Lenovo ThinkPad E560 */
+               .matches = {
+                        DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+                        DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad E560"),
+                },
+        },
+
    { }
 };

ПС. Следуя предложению @StephenKitt, я попытался отправить этот пост в качестве отчета об ошибке ядра Linux на linux -input@vger.kernel.org

0
18.06.2021, 07:05
1 ответ

Эта часть регулярного выражения является источником ошибки:[\s-.]

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

Например:

  • [a-z]означает «сопоставить все строчные буквы от a до z»
  • [-az]или [az-]означают «соответствие тире, букве «а» или букве «z»
  • .

Кстати, ни одна известная мне версия sed не понимает perl -ish \dкак синоним [0-9]или [:digit:]. Некоторые версии sed(, например. GNU sed )понимает \sкак синоним пробелов и табуляции ([:blank:]), но, конечно, не все. А те, кто действительно понимают \s, возможно, понимают только вне скобочных выражений (я не знаю никого, кто понимает это внутри [], но это не это не означает, что нет какого-то неясного варианта sed, который делает ).

И, насколько мне известно, sed не понимает, что Perl (?:)означает незахватывающее -подвыражение.

Чтобы использовать функции расширенного регулярного выражения (ERE ), такие как {}, не экранируя их как \{и \}, вам нужно использовать параметр sed -E(, и их экранирование может быть GNU расширение, как и для \+, поэтому может не работать для всех версий sed ).

Чтобы сопоставить 12 -19 цифр, которые могут содержать пробелы или тире, и заменить их звездочками, сначала нужно удалить пробелы и тире, а затем попытаться сопоставить 12 -19 цифр.. например.

echo "$info" | sed -E -e 's/[[:blank:]-]//; s/[[:digit:]]{12,19}/*/g'

ПРИМЕЧАНИЕ. :Если вас не волнует переносимость и вы вряд ли когда-либо будете иметь дело со старыми или проприетарными версиями sed, это будет нормально. В противном случае придерживайтесь основных регулярных выражений (BRE )или используйте perl -nили perl -pвместоsed(и определенно используйте perl, если вы хотите использовать диалект Perl регулярных выражений ).

Также обратите внимание, что это повлияет на все, что находится в $info, поэтому все пробелы и тире будут удалены. В зависимости от того, что находится в $info, это может быть не то, что вам нужно.

Если $info может содержать другой текст (, например. VISA 1234123412341234 EXP 1222 CVV 123вместо просто 1234123412341234), тогда вам, вероятно, следует использовать awk или perl вместо sed, чтобы вы могли легко работать с каждым отдельным полем, а не со всей строкой.

2
28.07.2021, 11:25

Теги

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