Regex 如何阅读这个正则表达式

Regex 如何阅读这个正则表达式,regex,bash,sed,Regex,Bash,Sed,我被告知将此正则表达式与sed一起使用: sed 's/^.*=\([^=]*\)=.*=.*$/\1/' 要从中获取路径零件,请执行以下操作: NAME=PATH=USER=DATE 如果我“读”正则表达式,我会说这样的话:从行首(^),任意字符,任意次数(*),然后是等号(=)。在那里,我只会得到NAME=。我不明白的是接下来要读什么,\(\)部分 我已经看过多次了,我知道这与表达式末尾的/\1有关,但我不太明白 另一部分(=.*=.*$)是:从等号(=)开始任意字符任意次数(*),直

我被告知将此正则表达式与sed一起使用:

sed 's/^.*=\([^=]*\)=.*=.*$/\1/' 
要从中获取路径零件,请执行以下操作:

NAME=PATH=USER=DATE
如果我“读”正则表达式,我会说这样的话:从行首(
^
),任意字符,任意次数(
*
),然后是等号(
=
)。在那里,我只会得到
NAME=
。我不明白的是接下来要读什么,
\(\)
部分

我已经看过多次了,我知道这与表达式末尾的
/\1
有关,但我不太明白


另一部分(
=.*=.*$
)是:从等号(
=
)开始任意字符任意次数(
*
),直到它读到一个相等(
=
)为止,再重复一次,直到到达行尾(
$
)为止的任意字符。

括号前的\s用于转义


它的意思是,
“字符串的开头(^),任意次数的任何字符(.\*),然后是等号(=),然后是开始括号('\('),然后是除'='以外的任何字符,任意次数([^=]\*),然后是结束括号('\'),然后是等号(=),然后是任意次数的任何字符(.\*),然后是等号(=),然后是任意字符任意次数(.\*),然后是字符串的结尾($)。“

括号将您希望捕获的结果分组,在本例中是“任意数量的非“=”字符的字符”。如果括号中有后续组,则括号内的模式匹配的字符串稍后可称为\1--或\2、\3等。括号前的“\”需要转义(,)字符,以便将它们解释为分组符号——不确定它们是否需要以这种方式转义给sed或从读取表达式的shell解释器中转义。

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

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


有关sed中使用的正则表达式的详细信息,请参见。

要获得
路径
,我会使用一个简单的
awk
,如下所示:

echo "NAME=PATH=USER=DATE" | awk -F= '{print $2}'
PATH
易于理解,并且工作出色。

通过
=
设置文本,然后打印第二个字段。

或使用
剪切

$ echo "NAME=PATH=USER=DATE" | cut -d= -f2
PATH

尝试或者。@Boris:对sed不起作用,
\(
这里没有像f.e.perl中那样的转义参数。你为什么不在什么时候问呢?我看不出有什么理由为此再发一篇帖子?这个问题似乎离题了,因为它是关于澄清在中收到的一个响应。对于sed来说不正确,转义参数是一个捕获组,而不是字面上的参数。该死,我不知道。非常感谢。