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