Bash sed соответствует строке и возвращает другую строку в текстовом файле. - PullRequest
0 голосов
/ 03 октября 2018

Я пытаюсь получить путь к объекту для приложения телефонии на базе HFP.У нас есть скрипт с именем list-modems, который может перечислять свойства путей к объектам.Я хочу вернуть путь к объекту, который имеет строку Powered = b'1', но не уверен, где эта строка будет, я думаю, что это может быть сделано с помощью sed и regex, но у меня нет существенного опыта с этим.Поэтому мне нужна помощь.Файл, о котором идет речь, имеет некоторый текст, подобный следующему:

[ /hfp/org/bluez/hci0/dev_7C_46_85_3E_36_66 ]
    Interfaces = b''
    Lockdown = b'0'
    Online = b'0'
    Features = b''
    Type = b'hfp'
    Powered = b'0'
    Name = b'MCO'
    Emergency = b'0'
[ /hfp/org/bluez/hci0/dev_D0_FC_CC_12_6D_4D ]
    Interfaces = b'org.ofono.VoiceCallManager org.ofono.CallVolume org.ofono.Handsfree org.ofono.NetworkRegistration '
    Lockdown = b'0'
    Online = b'1'
    Serial = b'D0:FC:CC:12:6D:4D'
    Features = b'net '
    Type = b'hfp'
    Powered = b'1'
    Name = b"Ak\xc4\xb1n's J7 Prime"
    Emergency = b'0'
    [ org.ofono.VoiceCallManager ]
        EmergencyNumbers = b'08 000 999 110 112 911 118 119 '
    [ org.ofono.CallVolume ]
        Muted = b'0'
        SpeakerVolume = b'50'
        MicrophoneVolume = b'50'
    [ org.ofono.Handsfree ]
        DistractedDrivingReduction = b'0'
        Features = b'three-way-calling echo-canceling-and-noise-reduction voice-recognition release-all-held release-specified-active-call private-chat create-multiparty hf-indicators '
        EchoCancelingNoiseReduction = b'1'
        BatteryChargeLevel = b'3'
        InbandRinging = b'1'
        VoiceRecognition = b'0'
    [ org.ofono.NetworkRegistration ]
        Mode = b'auto-only'
        Status = b'registered'
        Strength = b'40'
        Name = b'vodafone TR'
[ /hfp/org/bluez/hci0/dev_D8_5B_2A_5B_7B_E6 ]
    Interfaces = b''
    Lockdown = b'0'
    Online = b'0'
    Features = b''
    Type = b'hfp'
    Powered = b'0'
    Name = b'Samsung Galaxy S7'
    Emergency = b'0'
[ /hfp/org/bluez/hci0/dev_14_5A_05_AB_66_F4 ]
    Interfaces = b''
    Lockdown = b'0'
    Online = b'0'
    Features = b''
    Type = b'hfp'
    Powered = b'0'
    Name = b"Ekrem iPhone'u"
    Emergency = b'0'
[ /phonesim ]
    Interfaces = b''
    Lockdown = b'0'
    Online = b'0'
    Features = b''
    Type = b'hardware'
    Powered = b'0'
    Emergency = b'0'

Я хочу вернуть путь к объекту, т.е. /hfp/org/bluez/hci0/dev_D0_FC_CC_12_6D_4D, если он имеет свойство Powered = b'1'.Имейте в виду, что этот файл генерируется случайным образом, то есть места каждого свойства отличаются от одного прогона к другому прогону.

Пока у меня есть следующее регулярное выражение для соответствия пути объекта:

./list-modems | grep -E '/hfp/org/bluez/hci[0-9]/dev_[0-9A-F]{2}_[0-9A-F]{2}_[0-9A-F]{2}_[0-9A-F]{2}_[0-9A-F]{2}_[0-9A-F]{2}'

Любая помощь с благодарностью, как дальше решать эту проблему.Заранее спасибо

РЕДАКТИРОВАТЬ: Ожидаемый результат для этого примера (так как он имеет Powered = b'1'):

/hfp/org/bluez/hci0/dev_D0_FC_CC_12_6D_4D

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

с использованием grep и tr

./list-modems | grep -zPo '/hfp/org/bluez/hci\d/dev(_[0-9A-F]{2}){6}(?=((?!/hfp/org/bluez/hci)[\s\S])*Powered = b\0471\047)' | tr '\0' '\n'

и рекурсивного регулярного выражения

./list-modems | grep -zPo '(/hfp/org/bluez/hci\d/dev(_[0-9A-F]{2}){6})(?=((?!(?1))[\s\S])*Powered = b\0471\047)' | tr '\0' '\n'
0 голосов
/ 03 октября 2018

Вы можете использовать awk здесь:

 awk '/^\[/{op=$0;next} /Powered.*b.1./{print op;exit}' ./list-modems

Если строка начинается с [, то она захватывает строку в переменную op.Если строка соответствует /Powered.*b.1./, то она печатает все, что находится в этой переменной, и завершается (при условии, что в файле есть только одно совпадение. Если ожидается больше совпадений, просто удалите ;exit).

Вы также можете добавить регулярное выражение /^\[/ своим собственным, чтобы соответствовать пути, но, учитывая ваш формат файла, я думаю, что это излишне.

Вы можете убить и эти дополнительные скобки, пропустив их через gensub при печати:

 awk '/^\[/{op=$0;next} /Powered.*b.1./{print gensub(/\[\s|\s\]/,"","g", op);exit}' ./list-modems

В действии с вашими примерами данных:

$ awk '/^\[/{op=$0;next} /Powered.*b.1./{print gensub(/\[\s|\s\]/,"","g", op);exit}' ./list-modems
/hfp/org/bluez/hci0/dev_D0_FC_CC_12_6D_4D
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...