我有以下格式的数据列表:
eth0: flags=73<UP,LOOPBACK,RUNNING> mtu 1500
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0xfe<compat,link,site,host>
loop (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
eth1: flags=73<UP,LOOPBACK,RUNNING> mtu 1500
inet6 ::1 prefixlen 128 scopeid 0xfe<compat,link,site,host>
loop (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
我需要选择eth1
(这是第一个单词,并且始终e
是以开头的单词),其后没有127.0.0.1
(也可能在下一行的后面出现)。
这里eth0
不合格,因为后面跟着127.0.0.1
我尝试了一切,但似乎没有任何效果。正则表达式甚至可能吗?如果是,那怎么办?
不确定Ubuntu的实现细节,但可以使用否定的前瞻:
^eth\d+(?=:)(?!.*\n.*[^0-9]127\.0\.0\.1[^0-9])
^eth\d+(?=:)
-行的开头必须是“ eth”,后跟一个或多个数字,然后是冒号,但不要捕获冒号(?!.*\n.*[^0-9]127\.0\.0\.1[^0-9])
-确保上一个匹配项之后的内容不包含“ 127.0.0.1”
@rahulKushwaha永远不要使用
(.|\n)*
,这总是一个错误的主意。.
(通常)可以匹配换行符,前提是使用正则表达式模式传递了正确的选项。我希望它可以在regex101网站上正常工作,因为您似乎已经在regex101网站上对其进行了测试,但是它不能在任何标准UNIX工具中使用。我很惊讶OP接受它作为最佳答案。
@EdMorton在我在开头的句子中回答时,尚不知道正则表达式的风格和可用的工具集。鼓励用户接受对他们最有帮助的答案。如果我的答案不能帮助他们实现目标,则OP非常欢迎更改接受的答案。
是的,您的答案完全没有错。正如我所说的,我敢肯定它会工作在regex101伟大,我只是给出惊讶OP接受了它(因此有效地劝阻他人张贴的答案),它会在任何标准的UNIX工具不工作(向前看符号和
\d
有问题),并从评论中看来,他们似乎仍在努力使其能够使用所使用的任何工具来工作。谢谢。不过,我认为他们的工具更可能不支持先行,并且将先行语法解释为其他内容(例如,可能
(
被解释为捕获组的开始以及?
零或一的重复等)。恰好不会失败,并为一个示例用例产生了预期的输出。但是不知道OP使用什么工具,我们都在猜测...