为什么此模式无法正常运行?

时间:2020-01-18 16:01:38

标签: regex xml awk

我尝试打印捕获的组,但是awk无法捕获它。我的regex语法似乎没错。有什么我想念的吗?

以下是文字:

<key>NetworkServices</key>
<dict>
    <key>44412617dfsretret44rewtrtA2</key>
    <dict>
        <key>com.fdgfdgfg.ew3rer.gggfgfdgfg</key>
        <dict>
            <key>endpointProtocols</key>
            <array>
                <string>UDP:443:1450</string>
                <string>TCP:443:1450</string>
            </array>
        </dict>
        <key>DNS</key>
        <dict>
            <key>__INACTIVE__</key>
            <true/>
        </dict>
        <key>UserDefinedName</key>
        <string>4ghgfggfddg</string>
        <key>IPv6</key>
        <dict>
            <key>ConfigMethod</key>
            <string>Automatic</string>
        </dict>
        <key>Interface</key>
        <dict>
            <key>Type</key>
            <string>VPN</string>
        </dict>
        <key>__INACTIVE__</key>
        <true/>
        <key>VPN</key>
        <dict>
            <key>DisconnectOnIdle</key>
            <integer>0</integer>
        </dict>
        <key>IPv4</key>
        <dict>
            <key>ConfigMethod</key>
            <string>VPN</string>
        </dict>
        <key>Proxies</key>
        <dict>
            <key>__INACTIVE__</key>
            <true/>
            <key>FTPPassive</key>
            <integer>1</integer>
        </dict>
    </dict>
    <key>DF6rftr34354tergsdfsdf1D9</key>
    <dict>
        <key>Interface</key>
        <dict>
            <key>Type</key>
            <string>fgfdgfgfgr</string>
            <key>Hardware</key>
            <string>cfghfhgrCenter</string>
            <key>DeviceName</key>
            <string>ip1</string>

这是我的代码:

cat /var/text.txt |  awk 'match($0, /<key>NetworkServices<\/key>.*<key>(.*)<\/key>.*<key>Interface<\/key>.*<\/key>.*<string>ip1<\/string>/) {print substr($0, RSTART+1, RLENGTH-1)}'

它应该打印DF6rftr34354tergsdfsdf1D9,但没有。

谢谢。

这是经过测试的屏幕截图: enter image description here

1 个答案:

答案 0 :(得分:1)

我认为 awk 不是执行此操作的正确工具,因为它旨在逐行工作。由于您的模式跨越多行并且您有一个XML文件,因此请充分利用XML强大的结构。

因此,如果要在满足某些条件的标签下显示文本节点,请使用 xpath 表达式选择它。

根据您在上面编写的正则表达式,假设您正在寻找包含文本“ NetworkServices”的标签<key>,然后转到标记为<dict>的下一个节点,然后找到要查找的<key>节点,记住文本(这就是您要查找的文本),并验证其后跟<key>Interface</key>,然后转到下一个标记为{{1}的节点},您必须检查节点<dict>后跟<key>DeviceName</key>的存在。

这是我将根据以下代码使用 xpath 进行选择的代码:

<string>ip1</string>