Для этого можно использовать " символы привязки ".
grep "[[:print:]]*_P$" file.txt
или, проще говоря, (согласно комментарию @JeffSchaller)
grep "_P$" file.txt
должен достичь того, чего вы хотите.
Основываясь на ответе @meuh, мне удалось заставить его работать, хотя и немного иначе, чем я изначально планировал.
Запись в файл >/sys/devices/.../sound/card0/id
действительно была правильным решением, поэтому для этой цели я написал небольшой bash-скрипт
#!/bin/bash
for file in $(find /sys/devices/ -name id | grep sound | grep usb)
do
for fragment in $(echo $file | tr "/" "\n")
do
if [[ $fragment == *"1.2.1"* ]]
then
printf "%s" "EXT_B1" > "$file"
fi
if [[ $fragment == *"1.2.2"* ]]
then
printf "%s" "EXT_B2" > "$file"
fi
# etc
done
done
Эту часть-for fragment in $(echo $file | tr "/" "\n")
-возможно можно было бы сделать более изящно, но я не могу просто использовать полный путь к файлу, т.к. хочу использовать любую звуковую карту и идентифицировать их только через порт USB, но на данный момент У меня только одна звуковая карта, поэтому я не могу проверить, меняется ли этот путь для разных моделей или поставщиков. Отсюда поиск шаблона 1.2.1
и т. д., описывающего конкретный порт USB-концентратора, подключенного к конкретному USB-порту моего устройства.
Мне не удалось запустить его с помощью правил udev -очевидно, вам нужен root-доступ для записи в /sys/devices/...
(, что имеет смысл ), но, несмотря на просмотр нескольких ответов,Я не смог это сделать -, может быть, потому что я использую Raspbian Jessie на Raspberry Pi, может быть, потому что я мало знаю о Linux.
Однако мой вариант использования не обязательно требует, чтобы скрипт запускался при подключении устройства -достаточно просто запустить его при загрузке, поэтому последнее, что нужно было сделать, это отредактировать crontab с помощью sudo crontab -e
и добавить строку
@reboot /path/to/my/script.sh
И вуаля , я могу получить доступ к определенной звуковой карте USB в коде Java, используя AudioSystem.getMixerInfo()
, и воспроизвести звук, используяAudioSystem.getClip(mixerInfo)
Вы на правильном пути. Есть много вещей, которые могут пойти не так с udev. Причина, по которой правила udev с NAME="..."
больше не работают, заключается в том, что ядро больше не позволяет вам переименовывать устройства таким образом. Создание символических ссылок с SYMLINK+=
в целом работает, но я не знаю, заинтересованы ли они в alsa.
Таким образом, я думаю, что наиболее правильным решением является совет, данный в вашей связанной статье в разделе под названием Идентифицировать два идентичных аудиоустройства . Используйте правило с DEVPATH==
, чтобы сопоставить устройство, и ATTR{id}="ABC"
, чтобы дать уникальное имя этому устройству, которое вы затем найдете в aplay -l
или cat /proc/asound/cards
.
Сначала попробуйте сделать то же самое вручную. У меня нет звуковых USB-карт, а есть только встроенное -устройство, так что если у меня есть:
find /sys/devices/ -name id | grep sound
в нем перечислены многие элементы с именем "id", но некоторые из них являются каталогами, и единственный файл, представляющий интерес, это /sys/devices/.../sound/card0/id
. Если я cat
этот файл, он содержит имя устройства ("PCH" ).Если я запишу строку в этот псевдо-файл -, он изменит свое имя :
sudo sh -c 'printf "%s" MYCARD >/sys/devices/.../sound/card0/id'
и это видно в выводе aplay -l
. Это то, что вы пытаетесь сделать с помощью udev; псевдофайл sysfs -id
является атрибутом из card0
. Таким образом, в udev ATTR{id}=
работает только в том случае, если вы сопоставили правильный каталог /sys
, то есть /sys/devices/.../sound/card0
в моем случае. Вот почему правило udev гласит DEVPATH=="/sys/devices/.../sound/card?"
(, что номер карты может измениться, поэтому он заменяется подстановочным -символом карты "?" ).
Более полный пример см. в упомянутом выше -разделе ссылки, в котором содержится полный файл правил 85-my-usb-audio.rules
.