【发布时间】:2020-05-05 05:21:37
【问题描述】:
我尝试打印捕获的组,但awk 未能捕获它。我的正则表达式语法似乎没有错。有什么我错过的吗?
这是正文:
<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,但它没有。
提前致谢。
【问题讨论】:
-
能否告诉我们您要打印哪个
<key>块,它的条件是什么? -
您使用的是哪个版本的 Awk? regular expressions 上的 GNU Awk 手册似乎没有提到捕获组 - 但 string manipulation functions 中的
gensub示例显示它们在工作。这是一个 GNU 扩展功能;这意味着sub和gsub不这样做。 -
另外,请记住,默认情况下,Awk 在单行上工作。
-
@JonathanLeffler gawk 家伙决定离开 sub() 和 gsub() POSIX 兼容,以便向后兼容和移植到其他 awk 变体,这就是为什么他们为捕获组引入 gensub() 并能够对字符串字面量进行操作并返回修改后的字符串(即类似 sed 的 sub() 函数)。他们还引入了非常有用的第三个参数来 match() 以使用捕获组填充数组。