Оказывается, подчеркивание, которое вы хотите заменить, ВСЕГДА стоит после точки .
, за которой следует одна цифра [0-9]
.
sed 's|\.\([0-9]\)_|.\1\t|'
Здесь будет искаться буквальная точка \.
за которой следует одна цифра, которую мы сохраним в группе \([0-9]\)
за которой следует знак подчеркивания _
. Замените это точкой, первой группой, которую мы сохранили \1
и табуляцией \t
.
Хорошо, мне удалось найти довольно простой способ обойти эту проблему. Идеальным решением (на мой взгляд) было бы предотвратить создание / dev / input / event1
и 2
, но я не заставил правила udev работать так, как я хотел.
Вместо этого я использовал EVIOCGRAB
в моем приложении Qt. У меня есть «глобальный» фильтр событий вверху, который определяет, прикоснулся ли пользователь к устройству, и затемняет дисплей после пары минут бездействия. Добавив в конструктор:
QString dev1 = QLatin1String("/dev/input/event1");
QString dev2 = QLatin1String("/dev/input/event2");
int fd1 = QT_OPEN(dev1.toLocal8Bit().constData(), O_RDONLY | O_NDELAY, 0);
if(fd1 >= 0)
{
::ioctl(fd1, EVIOCGRAB, 1);
qDebug() << "Grabbed " << dev1;
}
int fd2 = QT_OPEN(dev2.toLocal8Bit().constData(), O_RDONLY | O_NDELAY, 0);
if(fd2 >= 0)
{
::ioctl(fd2, EVIOCGRAB, 1);
qDebug() << "Grabbed " << dev2;
}
и больше ничего не делая, я получил нужный мне результат. Входные данные из event1
и event2
больше не отображаются в моем приложении (и недоступны для evtest
), и если я выхожу из приложения, то устройства событий снова стать «активным».
Работает как шарм!
// Андерс