为什么这会添加空格?echo "x ax" | sed 's/x\s*/x /'

Tim*_*Tim 4 sed regular-expression replace

我想找到一个x, 并将后面的 0 个或多个空格 ( \s*) 替换为一个空格。

echo "x ax" | sed 's/x\s*/x /'
Run Code Online (Sandbox Code Playgroud)

出于某种原因,它没有用单个空格替换空格,而是将一个空格附加到之前存在的空格中:

x  ax
Run Code Online (Sandbox Code Playgroud)

不管我使用了标志,使用+替代*似乎绝对没有-E

似乎sed没有做非贪婪的表达式,那么为什么*在匹配时不消耗所有空格?

我是非 bash 设置中的正则表达式忍者,但 bash 及其工具让我活着。我不知道如何为成功的搜索引擎查询简洁地表达这一点。

Gil*_*il' 12

sed需要一个基本的正则表达式(BRE)。\s不是 BRE 中的标准特殊构造(也不是ERE中,就此而言),这是某些语言的扩展,特别是 Perl(许多其他语言模仿)。在 sed 中,根据实现,\s要么代表文字字符串,要么代表\s文字字符s

在您的实现中,似乎\s匹配s,因此\s*匹配 0 或更多s,并且x\s*匹配x您的示例输入,因此x ax被转换为x ax(并且xy将被转换为x y等等)。在其他实现中(例如使用 GNU sed),\smatches \s,因此\s*匹配后跟 0 或更多的反斜杠s,这不会出现在您的输入中,因此该行保持不变。

这与贪婪完全无关。贪婪不会影响字符串是否与正则表达式匹配,只会影响匹配捕获字符串的哪一部分。

  • @Tim 您使用的是什么 sed 实现?你写的是 `x[[:space:]]` 而不是 `x[:space:]`? (2认同)