我被告知要使用这个正则表达式与sed:
sed 's/^.*=\([^=]*\)=.*=.*$/\1/'
从以下位置获取PATH部分:
NAME=PATH=USER=DATE
如果我"阅读"正则表达式我会说:从行的开头(^
),任意次数(.*
),然后是等号(=
)。在那里,我会得到NAME=
。我不明白的是接下来要阅读的内容\( \)
部分。
我已经多次看过这个,我知道它与表达结尾处的/\1
有关,但我不太明白。
另一部分(=.*=.*$
)将是:等号(=
)任意字符(.*
),直到它读取相等(=
) })再次,任何字符,直到到达行尾($
)。
答案 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 ($)."