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,这不会出现在您的输入中,因此该行保持不变。
这与贪婪完全无关。贪婪不会影响字符串是否与正则表达式匹配,只会影响匹配捕获字符串的哪一部分。