如何阅读这个正则表达式

时间:2014-04-27 19:03:36

标签: regex bash sed

我被告知要使用这个正则表达式与sed:

sed 's/^.*=\([^=]*\)=.*=.*$/\1/' 

从以下位置获取PATH部分:

NAME=PATH=USER=DATE

如果我"阅读"正则表达式我会说:从行的开头(^),任意次数(.*),然后是等号(=)。在那里,我会得到NAME=。我不明白的是接下来要阅读的内容\( \)部分。

我已经多次看过这个,我知道它与表达结尾处的/\1有关,但我不太明白。

另一部分(=.*=.*$)将是:等号(=)任意字符(.*),直到它读取相等(=) })再次,任何字符,直到到达行尾($)。

3 个答案:

答案 0 :(得分:3)

\([^=]*\)用于捕获括号内的匹配部分。然后,您可以在s///命令的第二部分中将此匹配用作\1

通常,您可以使用\N来使用N捕获的部分匹配或&替换完整匹配的正则表达式。

有关sed中使用的正则表达式的详细信息,请参阅Overview of Regular Expression Syntax

答案 1 :(得分:1)

括号将你想要捕获的结果分组,在这种情况下"任何数量的字符都不是' ='字符&#34 ;.如果括号中有后续组,则括号内的模式匹配的字符串稍后可以称为\ 1 - 或\ 2,\ 3等。 ' \'在需要使用括号来转义(,)字符以便将它们解释为分组符号之前 - 不确定它们是否需要以这种方式转义为sed或shell解释器读取表达式。

答案 2 :(得分:-3)

括号前面的\ s用于转义。

这意味着"The start of the string (^), any character any number of times (.\*), then an equal sign (=), then an opening bracket ('\('), then any character EXCEPT '=', any number of times ([^=]\*), then a closing bracket ('\)'), then an equal sign (=), then any character any number of times (.\*), then an equal sign (=), then any character any number of times (.\*), then the end of the string ($)."