为什么 [0-9]* 匹配没有任何数字的地方?

sid*_*nup 6 sed regular-expression

所以命令是:

echo "abc 123" | sed "s/[0-9]*/h/g"
Run Code Online (Sandbox Code Playgroud)

我得到的输出为

hahbhch h
Run Code Online (Sandbox Code Playgroud)

我如何得到这个输出?

我期望的输出是 abc h

我通过这个命令得到的:

echo "abc 123" | sed "s/[0-9][0-9]*/h/g"
Run Code Online (Sandbox Code Playgroud)

谁能解释一下。。

Kir*_*ira 18

*意味着零个或多个匹配,并且尽快匹配。如果您在没有g标志的情况下运行该命令(这意味着sed将在第一次替换后停止),您将获得输出habc 123。这是因为它从左到右开始读取,并且因为它无法匹配a,它只会匹配行的开头然后停在那里。

使用 global ( g) 标志,它将继续尝试匹配字符串的其余部分,并且由于*在无法匹配其他任何内容时匹配空字符串,因此h每次无法匹配更多数字时都会放置一个。

请注意,您的第二次尝试等效于sed "s/[0-9]\+/h/". 这里+表示一个或多个匹配项,这意味着当它找不到要替换的数字时,它不会匹配空字符串。