Если Вы хотите выбрать @
и до первого ,
после этого необходимо указать его как @[^,]*,
Это @
сопровождаемый любым числом (*
) из незапятых ([^,]
) сопровождаемый запятой (,
).
Тот подход работает эквивалентом @.*?,
, но не для вещей как @.*?string
, это - то, где то, что после, является больше, чем отдельный символ. Отрицание символа является легкими, но инвертирующими строками в regexps, является намного более трудным.
Другой подход должен предварительно обработать Ваш вход, чтобы заменить или предварительно ожидать string
с символом, который иначе не происходит в Вашем входе:
gsub(/string/, "\1&") # pre-process
gsub(/@[^\1]*\1string/, "")
gsub(/\1/, "") # revert the pre-processing
Если Вы не можете гарантировать, что вход не будет содержать Ваш символ замены (\1
выше), один подход должен использовать механизм выхода:
gsub(/\1/, "\1\3") # use \1 as the escape character and escape itself as \1\3
# in case it's present in the input
gsub(/\2/, "\1\4") # use \2 as our maker character and escape it
# as \1\4 in case it's present in the input
gsub(/string/, "\2&") # mark the "string" occurrences
gsub(/@[^\2]*\2string/, "")
# then roll back the marking and escaping
gsub(/\2/, "")
gsub(/\1\4/, "\2")
gsub(/\1\3/, "\1")
Это работает на фиксированный string
s, но не для произвольного regexps как для эквивалента @.*?foo.bar
.
Вы не должны изменять ядро только к этому только однажды; можно переопределить его.
modprobe ftdi_sio
echo 0403 6001 >/sys/bus/usb-serial/drivers/ftdi_sio/new_id
И Ваше устройство должно работать.
Ваша другая альтернатива должна использовать bind
интерфейс sysfs; я предлагаю использовать lsusb -t
выяснять корректный path+interface в этом случае.
Используя частичный пример от моей системы, устройства хранения USB (это было бы очень похоже для последовательного usb).
$ lsusb -t
...
/: Bus 04.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/2p, 5000M
|__ Port 1: Dev 5, If 0, Class=Hub, Driver=hub/3p, 5000M
|__ Port 3: Dev 6, If 0, Class=Hub, Driver=hub/3p, 5000M
|__ Port 3: Dev 7, If 0, Class=Mass Storage, Driver=usb-storage, 5000M
...
$ echo '4-1.3.3:1.0' >/sys/bus/usb/drivers/usb-storage/bind
Формат числа: BUS-PORT(.PORT)+:1.INTERFACE
. Единственное число это не видимо в выводе lsusb, является первой цифрой после двоеточия; и это всегда был a 1
по моему опыту. Кто-то с более глубоким знанием ядра может, вероятно, сказать мне, что это, и обеспечьте контрпример.
Вам не нужно изменять ядро, вы можете автоматизировать такой процесс:
Добавьте следующую одну строку в /etc/udev/rules.d/99 -фтди.рулы
Действие == «Add», Attrs {Idvendor} == "0403", Attrs {IdProduct} == "6001", Run + = "/ sbin / modprobe ftdi_sio" Run + = = "/ bin / sh -c 'echo 0403 6001> / sys / bus / usb-serial / drivers / ftdi_sio / new_id' "
Либо перезагрузите или запустить Sudo UDEvAdm Control --reload
, чтобы забрать новое правило.
Отключите устройство.
Подключите устройство.
абсолютно аналогичная ситуация произошла с платой eval от SiLabs -чип USB -UART CP2102 с нестандартным VID/PID:
lsusb
Bus 001 Device 002: ID 10c4:804c Cygnal Integrated Products, Inc.
проблема решена загрузкой модуля cp210x и отправкой VID/PID, как упоминалось ранее:
sudo modprobe cp210x
sudo -s
echo 10c4 804c > /sys/bus/usb-serial/drivers/cp210x/new_id
соответствующий 99 -файл cp210.rules для udev выглядит следующим образом:
ACTION=="add", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="804c", RUN+="/sbin/modprobe cp210x" RUN+="/bin/sh -c 'echo 10c4 804c > /sys/bus/usb-serial/drivers/cp210x/new_id'"