有人可以分解这个正则表达式吗?
Can someone breakdown this regular expression?
在寻找格式化 'ifconfig' 输出并仅显示网络接口名称的方法时,我发现了一个对 OS X 非常有用的正则表达式。
ifconfig -a | sed -E 's/[[:space:]:].*//;/^$/d'
如何分解这个正则表达式以便我理解它?
这是sed
命令
s/[[:space:]:].*//;/^$/d
中间有个分号,其实是两条命令:
s/[[:space:]:].*//
/^$/d
第一个命令是替换。用什么代替?它在第一个和第二个斜杠之间。
[[:space:]:].*
字符 class [] 任何类型的空格或冒号,后跟零个或多个 *
任何字符 .
。这匹配第一个空格或冒号之后一行中的所有内容。
用什么代替?在第二个两个斜杠之间:s/...//
:没有。每行删除匹配的字符串。
这留下了以行开头的接口名称,其他行也保留了下来,但是它们是空的,因为它们以空格开头。
如何去除这些空行?那是第二个命令:
/^$/d
查找与正则表达式匹配且行首 ^
和行尾 $
之间没有任何内容的空行。然后使用命令 d
.
删除它们
剩下的就是接口名称了。
感谢 Benjamin 和 Xufox 提供的资源。看完之后,我的结论是:
s/[[:space:]:].*//;
[[:space:]:]
这将搜索空格 and/or :
并开始执行命令,以及此命令和之后的任何内容(因此 '.*
' ) 将被替换为空(因为接下来是 //
,介于两者之间的应该是我们想要替换的东西,在这种情况下什么都不是。)。
;
标记第一个命令的结束
然后我们有
/^$/d
其中 ^$
表示搜索所有空格,d
表示删除它们。
这句话错了一半。看看另一个答案,它给你完整和正确的回应!谢谢大家。
这与其说是一个正则表达式,不如说是一个命令序列,但我想分解这个序列可能会有所启发。
阅读 ifconfig
上的联机帮助页以找到此内容
Optionally, the -a flag may be used instead of an interface name. This
flag instructs ifconfig to display information about all interfaces in
the system. The -d flag limits this to interfaces that are down, and
-u limits this to interfaces that are up. When no arguments are given,
-a is implied.
这是完成的一部分。管道 (|
) 将 ifconfig
通常打印到标准输出的内容发送到 sed
的标准输入。
您正在传递 sed
选项 -E
。同样,man sed
是你的朋友,告诉你这个选项意味着
Interpret regular expressions as extended (modern) regular
expressions rather than basic regular expressions (BRE's). The
re_format(7) manual page fully describes both formats.
但这不是您所需要的全部...您提供的第一个字符串 sed
让它知道要执行哪个操作。
在同一手册中搜索单词 "substitute" 以达到此目的
段落:
[2addr]s/regular expression/replacement/flags
Substitute the replacement string for the first instance of
the regular expression in the pattern space. Any character other than
backslash or newline can be used instead of a slash to delimit the RE
and the replacement. Within the RE and the replacement, the RE
delimiter itself can be used as a literal character if it is preceded
by a backslash.
现在我们可以运行 man 7 re_format
解码第一个命令s/[[:space:]:].*//
,这意味着"for each line passed to standard input, substitute the part matching the extended regular expression [[:space:]:].*
with the empty string"
[[:space:]:]
= 匹配 :
或字符 class [:space:]
中的任何字符
.*
= 匹配任意字符 (.
),零次或多次 (*
)
要了解第二个命令,请查找 sed
手册页的 [2addr]d
部分。
[2addr]d
Delete the pattern space and start the next cycle.
然后让我们看看下一个命令 /^$/d
上面写着 "for each line passed to standard input, delete it if it corresponds to the extended regex ^$
"
^$
= 开头 (^
) 和结尾 ($
) 之间不包含任何字符的行
我们已经讨论了如何从手册页开始并按照线索找到您在日常生活中看到的 "decode" 命令。
在寻找格式化 'ifconfig' 输出并仅显示网络接口名称的方法时,我发现了一个对 OS X 非常有用的正则表达式。
ifconfig -a | sed -E 's/[[:space:]:].*//;/^$/d'
如何分解这个正则表达式以便我理解它?
这是sed
命令
s/[[:space:]:].*//;/^$/d
中间有个分号,其实是两条命令:
s/[[:space:]:].*//
/^$/d
第一个命令是替换。用什么代替?它在第一个和第二个斜杠之间。
[[:space:]:].*
字符 class [] 任何类型的空格或冒号,后跟零个或多个 *
任何字符 .
。这匹配第一个空格或冒号之后一行中的所有内容。
用什么代替?在第二个两个斜杠之间:s/...//
:没有。每行删除匹配的字符串。
这留下了以行开头的接口名称,其他行也保留了下来,但是它们是空的,因为它们以空格开头。
如何去除这些空行?那是第二个命令:
/^$/d
查找与正则表达式匹配且行首 ^
和行尾 $
之间没有任何内容的空行。然后使用命令 d
.
剩下的就是接口名称了。
感谢 Benjamin 和 Xufox 提供的资源。看完之后,我的结论是:
s/[[:space:]:].*//;
[[:space:]:]
这将搜索空格 and/or :
并开始执行命令,以及此命令和之后的任何内容(因此 '.*
' ) 将被替换为空(因为接下来是 //
,介于两者之间的应该是我们想要替换的东西,在这种情况下什么都不是。)。
;
标记第一个命令的结束
然后我们有
/^$/d
其中 ^$
表示搜索所有空格,d
表示删除它们。
这句话错了一半。看看另一个答案,它给你完整和正确的回应!谢谢大家。
这与其说是一个正则表达式,不如说是一个命令序列,但我想分解这个序列可能会有所启发。
阅读 ifconfig
上的联机帮助页以找到此内容
Optionally, the -a flag may be used instead of an interface name. This flag instructs ifconfig to display information about all interfaces in the system. The -d flag limits this to interfaces that are down, and -u limits this to interfaces that are up. When no arguments are given, -a is implied.
这是完成的一部分。管道 (|
) 将 ifconfig
通常打印到标准输出的内容发送到 sed
的标准输入。
您正在传递 sed
选项 -E
。同样,man sed
是你的朋友,告诉你这个选项意味着
Interpret regular expressions as extended (modern) regular expressions rather than basic regular expressions (BRE's). The re_format(7) manual page fully describes both formats.
但这不是您所需要的全部...您提供的第一个字符串 sed
让它知道要执行哪个操作。
在同一手册中搜索单词 "substitute" 以达到此目的 段落:
[2addr]s/regular expression/replacement/flags
Substitute the replacement string for the first instance of the regular expression in the pattern space. Any character other than backslash or newline can be used instead of a slash to delimit the RE and the replacement. Within the RE and the replacement, the RE delimiter itself can be used as a literal character if it is preceded by a backslash.
现在我们可以运行 man 7 re_format
解码第一个命令s/[[:space:]:].*//
,这意味着"for each line passed to standard input, substitute the part matching the extended regular expression [[:space:]:].*
with the empty string"
[[:space:]:]
= 匹配:
或字符 class[:space:]
中的任何字符
.*
= 匹配任意字符 (.
),零次或多次 (*
)
要了解第二个命令,请查找 sed
手册页的 [2addr]d
部分。
[2addr]d
Delete the pattern space and start the next cycle.
然后让我们看看下一个命令 /^$/d
上面写着 "for each line passed to standard input, delete it if it corresponds to the extended regex ^$
"
^$
= 开头 (^
) 和结尾 ($
) 之间不包含任何字符的行
我们已经讨论了如何从手册页开始并按照线索找到您在日常生活中看到的 "decode" 命令。