有人可以分解这个正则表达式吗?

时间:2018-08-14 13:46:25

标签: regex terminal devops sysadmin

在寻找一种格式化“ ifconfig”输出并仅显示网络接口名称的方法时,我发现了一个正则表达式,它对OS X很有用。

ifconfig -a | sed -E 's/[[:space:]:].*//;/^$/d'

如何分解这个正则表达式以便我理解它?

3 个答案:

答案 0 :(得分:2)

这是sed命令

s/[[:space:]:].*//;/^$/d

中间有一个分号,因此实际上是两个命令:

s/[[:space:]:].*//
/^$/d

第一个命令是替换项。替代什么?它位于第一个2个斜杠之间。

[[:space:]:].*

任何类型的空格或冒号的字符类[],后跟零个或多个任何字符*的{​​{1}}。这将匹配第一个空格或冒号后一行中的所有内容。

用什么代替?在第二个斜杠之间:.:什么都没有。匹配的字符串将从每一行中删除。

这将保留以其行开头的接口名称,其他行也将保留,但是它们是空的,因为它们以空格开头。

如何删除这些空行?那是第二个命令:

s/...//

在行/^$/d 的开始和行^的结束之间找到与regex匹配的空行。然后使用命令$删除它们。

剩下的就是接口名称。

答案 1 :(得分:0)

感谢本杰明和许福克斯提供的资源。看一看,这就是我的结论:

  

s / [[[:space:]:]。* //;

[[:space:]:]将搜索空格和/或:并开始执行命令,此后以及随后出现的所有内容(因此'.*')将被替换(因为下一个是//,介于两者之间应该是我们想要替代的东西,在这种情况下,它就是空)。

  

;

标记第一个命令的结尾

然后我们有

  

/ ^ $ / d

其中^$表示搜索所有空白,而d表示将其删除。


这是错误的一半。看一下其他答案,它可以为您提供完整正确的答案!谢谢大家。

答案 2 :(得分:0)

比起正则表达式,这更多的是命令序列,但是我认为分解序列可能是有益的。

阅读ifconfig上的联机帮助页以查找

  

(可选)可以使用-a标志代替接口名称。这个   标志指示ifconfig显示有关所有接口的信息   系统。 -d标志将其限制为关闭的接口,并且   -u将其限制为启动的接口。如果没有给出任何参数,   -a是隐含的。

完成了一部分。管道(|ifconfig通常会打印的内容发送到标准输出到sed的标准输入。

您正在向sed传递选项-E。同样,man sed是您的朋友,并告诉您此选项的意思是

  

将正则表达式解释为扩展(现代)正则   表达式而不是基本正则表达式(BRE)。的   re_format(7)手册页全面介绍了这两种格式。

虽然这不是您所需要的全部...给您的第一个字符串sed让它知道要执行哪个操作。

在同一手册中搜索“替代”一词即可达到此目的 段落:

  

[2addr] s /正则表达式/替换/标志

     

用替换字符串替换第一个实例   模式空间中的正则表达式。除以下以外的任何字符   可以使用反斜杠或换行符代替斜杠来分隔RE   和替换。在可再生能源及其替代品中   分隔符本身可以用作文字字符(如果在前面)   反斜杠。

现在,我们可以运行man 7 re_format来解码第一个命令s/[[:space:]:].*//,这意味着“对于传递给标准输入的每一行,用空字符串替换匹配扩展正则表达式[[:space:]:].*的部分“

  • [[:space:]:] =匹配字符集:中的任何字符[:space:]
  • .* =匹配任意字符(.),零次或多次(*

要了解第二条命令,请查看[2addr]d手册页的sed部分。

  

[2addr] d

     

删除图案空间并开始下一个循环。

然后让我们看一下下一个命令/^$/d,该命令说:“对于传递给标准输入的每一行,如果它与扩展的正则表达式^$相对应,则将其删除”

  • ^$ =在开始(^)和结束($)之间没有任何字符的行

我们已经讨论了如何从手册页开始,并遵循线索来“解码”您在日常生活中看到的命令。