我正在尝试为基于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发布于 2018-10-03 13:17:25
你可以在这里使用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发布于 2018-10-03 13:18:31
使用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'https://stackoverflow.com/questions/52627653
复制相似问题