首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Bash sed匹配行并在文本文件中返回其他行。

Bash sed匹配行并在文本文件中返回其他行。
EN

Stack Overflow用户
提问于 2018-10-03 13:01:34
回答 2查看 59关注 0票数 0

我正在尝试为基于HFP的电话应用程序获取对象路径。我们有一个名为list-modems的脚本,它能够列出对象路径的属性。我想返回包含Powered = b'1'行的对象路径,但不确定这一行将在哪里,我认为这可能是使用sed和regex完成的,但我对它没有丰富的经验。因此,我需要一些帮助。所讨论的文件有如下所示的文本:

代码语言:javascript
复制
[ /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'。请记住,该文件是随机生成的,即每个属性的位置在每次运行时不同。

到目前为止,我有以下正则表达式来匹配对象路径:

代码语言:javascript
复制
./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'):

代码语言:javascript
复制
/hfp/org/bluez/hci0/dev_D0_FC_CC_12_6D_4D
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-10-03 13:17:25

你可以在这里使用awk:

代码语言:javascript
复制
 awk '/^\[/{op=$0;next} /Powered.*b.1./{print op;exit}' ./list-modems

如果该行以[开头,那么它会将该行捕获为变量op。如果一行与/Powered.*b.1./匹配,那么它会打印变量中的任何内容并退出(假设文件中只有一个匹配)。如果需要更多匹配,那么只需删除;exit)。

您也可以使用自己的/^\[/正则表达式来匹配路径,但考虑到您的文件格式,我认为这太过分了。

您也可以在打印时通过gensub运行这些额外的括号:

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

对您的样本数据进行操作:

代码语言:javascript
复制
$ 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
票数 2
EN

Stack Overflow用户

发布于 2018-10-03 13:18:31

使用grep和tr

代码语言:javascript
复制
./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'

和转移递归正则表达式

代码语言:javascript
复制
./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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52627653

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档