sed \{x,y\} 范围是否贪婪?

Kir*_*ira 6 sed regular-expression

例如,我想知道\{x,y\}insed是否会尝试匹配尽可能多或尽可能少的字符。

另外,有人可以向我解释以下意外行为sed吗?

echo "baaab" | sed 's/a\{1,2\}//'
bab

echo "baaab" | sed 's/a\{0,2\}//'
baaab
Run Code Online (Sandbox Code Playgroud)

在第一行中,sed变得贪婪,在第二行中显然没有,这有什么原因吗?

我使用的是 GNU sed 4.2.1 版。

mur*_*uru 15

a\{0,2\}将匹配行首的空字符串(实际上,任何空字符串,但未g指定):

$ echo "baaab" | sed 's/a\{0,2\}/y/' 
ybaaab
Run Code Online (Sandbox Code Playgroud)

由于 GNUsed从左到右进行匹配,并且未指定全局替换,因此仅匹配行的开头。如果您使用过g

$ echo "baaab" | sed 's/a\{0,2\}/y/g'
ybyyby
Run Code Online (Sandbox Code Playgroud)

开头和结尾的空字符串匹配,而aa、 和其余的a.


cuo*_*glm 6

是的,它很贪婪。

在符合 POSIX 的系统中,不仅如此,sed而且所有使用基本正则表达式的工具,匹配的模式总是贪婪的

对匹配序列的搜索从字符串的开头开始,并在找到与表达式匹配的第一个序列时停止,其中“第一个”被定义为“在字符串中最早开始”。如果模式允许可变数量的匹配字符,因此从该点开始有不止一个这样的序列,则匹配最长的这样的序列。例如,BRE“bb*”匹配字符串“abbbc”的第二到第四个字符,而ERE“(wee|week)(knights|night)”匹配字符串“weeknights”的所有十个字符。

与整个匹配是最左边匹配中最长的一致,每个子模式从左到右匹配最长的可能字符串。为此,应认为空字符串比根本没有匹配要长。例如,将 BRE "(. ). " 与 "abcdef"匹配,子表达式 "(\1)" 为 "abcdef",将 BRE "(a*)*" 与 "bc" 匹配,子表达式 "( \1)" 是空字符串。

该模式a\{0,2\}匹配任何出现a在零到二之间的字符。零出现意味着空字符串,它被认为比没有匹配要长,如上面指出的规范。

您使用的问题在于您没有将global 标志用于sed substitution 命令。如果没有global 标志,一旦找到第一个匹配项(即行首的空字符串)就sed停止s替换。


一般的形式是\{m,n\}0 <= m <= n <= RE_DUP_MAX,用RE_DUP_MAX32767在大多数平台:

$ getconf RE_DUP_MAX
32767
Run Code Online (Sandbox Code Playgroud)