我尝试打印捕获的组,但是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
,但没有。
谢谢。
答案 0 :(得分:1)
我认为 awk 不是执行此操作的正确工具,因为它旨在逐行工作。由于您的模式跨越多行并且您有一个XML文件,因此请充分利用XML强大的结构。
因此,如果要在满足某些条件的标签下显示文本节点,请使用 xpath 表达式选择它。
根据您在上面编写的正则表达式,假设您正在寻找包含文本“ NetworkServices”的标签<key>
,然后转到标记为<dict>
的下一个节点,然后找到要查找的<key>
节点,记住文本(这就是您要查找的文本),并验证其后跟<key>Interface</key>
,然后转到下一个标记为{{1}的节点},您必须检查节点<dict>
后跟<key>DeviceName</key>
的存在。
这是我将根据以下代码使用 xpath 进行选择的代码:
<string>ip1</string>