kar*_*non 0 sed regular-expression
当我遇到这个话题时,我最近正在阅读有关 sed 的内容。我需要一些例子来更好地理解这个话题。
标准支持的基本正则表达式(BRE) 中的区间正则表达式运算符sed将引用\{x,y\}.
等效的 ERE(扩展)或 PCRE(perl兼容)运算符(带有-r/-E, -R/-P与某些sed实现)将是{x,y}.
它们用于指定正则表达式的重复计数范围。
sed 's/<a\{3,12\}>/<b>/'
Run Code Online (Sandbox Code Playgroud)
将取代的第一次出现<,随后的3至12a秒,然后>用<b>。
在像 的输入上<a> <aa> <aaaa> <aaaaaaaa>,它将替换<aaaa>为<b>。
标记的正则表达式通常被称为捕获组。
在 BRE 中,这\(...\)与 ERE/PCRE 与(...). 它们用于捕获由正则表达式匹配的文本,以将其用作反向引用或替换。这些也可以用于分组(如\(foo\)*任意数量的foos)。
在:
sed 's/\(.\)\(.\)\(.*\)\2\1/\1\2<\3>\2\1/'
Run Code Online (Sandbox Code Playgroud)
我们有3个标记表达式又名捕捉组,所述字符(.是匹配单个字符)由第一匹配\(.\)将被标记用1,并且被称为\1在正规表达式(因此,如果所述第一后面上\(.\)捕获的x,\1将匹配x只),并且也在替换中回调。
在类似 的输入中whatever -+foobar+-,正则表达式会找到:(1:-)(2:+)(3:foobar)(2:+)(1:-)并且s命令会将其替换为-+<foobar>+-。
标准 (POSIX) ERE 不支持反向引用(\1在上面的正则表达式中),因此(...)仅用于分组(如 in(foo|bar)或(foo){1,3}),尽管某些实现支持它作为扩展。POSIX 规范的下一个主要版本将指定正则表达式使用 ERE的-E选项sed。\1在正则表达式(反向引用)中仍然不支持,但\1在s替换中扩展到与相应标记表达式匹配的内容。
python, perl, PCRE 或兼容的正则表达式还允许您为标记表达式指定任意名称(而不仅仅是1, 2... 从左到右编号)。有关详细信息,请参阅他们的手册。