首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将pcregrep转换为Perl一行

将pcregrep转换为Perl一行
EN

Stack Overflow用户
提问于 2022-03-27 16:27:54
回答 2查看 97关注 0票数 2

我需要在新的macOS上找到所有的活动网络接口。这意味着使用pcregrep的下列一行将无法工作:

代码语言:javascript
复制
ifconfig | pcregrep -M -o '^[^\t:]+(?=:([^\n]|\n\t)*status: active)'

因为pcregrep不是macOS上的默认安装。

我试图将其转换为egrep,但没有效果,因为积极的展望是不可能的,对吗?

所以我试着用perl中的一行程序。但是下面的命令不起作用,因为开关-pe没有将所有行合并在一起。我也和-p0e试过了。

代码语言:javascript
复制
ifconfig | perl -pe 'while (<>) {if (/^[^\t:]+(?=:([^\n]|\n\t)*status: active)/){print "$1";};}'

如果我以肯定的眼光搜索同一行,则它正在工作;例如:

代码语言:javascript
复制
ifconfig | perl -pe 'while (<>) {if (/^([^\t:]+)(?=:([^\n]|\n\t)*mtu 1380)/){print "$1";};}'
utun0

典型的ifconfig输出

代码语言:javascript
复制
en10: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
    options=6467<RXCSUM,TXCSUM,VLAN_MTU,TSO4,TSO6,CHANNEL_IO,PARTIAL_CSUM,ZEROINVERT_CSUM>
    ether 00:e0:4c:68:01:20
    inet6 fe80::1470:31b9:a01c:6f5e%en10 prefixlen 64 secured scopeid 0xd
    inet 192.168.178.39 netmask 0xffffff00 broadcast 192.168.178.255
    inet6 2003:ee:4f1a:ce00:864:f90c:9a11:6ad9 prefixlen 64 autoconf secured
    inet6 2003:ee:4f1a:ce00:d89a:7e34:6dd4:1370 prefixlen 64 autoconf temporary
    nd6 options=201<PERFORMNUD,DAD>
    media: autoselect (1000baseT <full-duplex>)
    status: active

预期结果将是:

代码语言:javascript
复制
en10

我在macOS蒙特利,zsh和perl 5.34

谢谢你的帮助

马立克

EN

回答 2

Stack Overflow用户

发布于 2022-03-27 19:34:28

您可以使用

代码语言:javascript
复制
perl -0777 -nE 'say "$&" while /^[^\n\r\t:]+(?=:(?:.*\R\t)*status:\h+active)/gm'

正则试验

在这里,-0777删除文件,以便正则表达式可以匹配多行文本跨度( M等效项将换行符暴露给pcregrep中的模式),say "$&"打印所有匹配的子字符串( o等效项,也请参见g标志)。

我编辑了[^\t:]+以匹配除制表符、冒号和CR/LF字符之外的任何一个或多个字符。另外,我将([^\n]|\n\t)*替换为一个更有效的(?:.*\R\t)*,它匹配除行中断字符(.*)、行中断序列(\R)和制表符字符(\t)结束之前的零或多个字符。

另外,请注意m标志使^锚点也匹配任何行开始位置。

票数 2
EN

Stack Overflow用户

发布于 2022-03-27 18:34:38

perl的-n和-p命令行开关在-e代码周围添加隐式while (<>) {.}块,此外,-p在每次迭代结束时打印行。因此,您需要将-p更改为-n,并且只打印出匹配的行;并删除多余的和不需要的while循环。所以就像

代码语言:javascript
复制
ifconfig | perl -ne 'print if /...../'
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71638153

复制
相关文章

相似问题

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