我最近在阅读 sed 时遇到了这个话题。我需要一些例子来更好地理解这个主题。
答案1
正则表达式中的区间运算符基本正则表达式标准支持的 (BRE)sed
指的是\{x,y\}
.
等效的 ERE(扩展)或 PCRE(perl
兼容)运算符(在某些实现中使用-r/-E
, -R
/ )将是。-P
sed
{x,y}
它们用于指定正则表达式的重复计数范围。
sed 's/<a\{3,12\}>/<b>/'
将替换第一次出现的 ,<
然后是 3 到 12a
秒,然后>
是<b>
。
在类似的输入上<a> <aa> <aaaa> <aaaaaaaa>
,它将替换<aaaa>
为<b>
。
标记正则表达式更常被称为捕获组。
在 BRE 中,这与\(...\)
ERE/PCRE 和(...)
.他们习惯了捕获与正则表达式匹配的文本,可以将其用作反向引用或在替换中。这些也可用于分组(如\(foo\)*
任意数量的foo
s)。
在:
sed 's/\(.\)\(.\)\(.*\)\2\1/\1\2<\3>\2\1/'
我们有 3标记表达式又名捕获组,第一个匹配的字符(.
用于匹配单个字符)\(.\)
将被标记为,并在正则表达式中稍后1
引用(因此,如果第一个捕获,将仅匹配 on ),并且也会在替代品。\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
... 从左到右编号)。详细信息请参阅他们的手册。