为什么这会添加空格?回声“x 斧头”| sed 's/x\s*/x /'

为什么这会添加空格?回声“x 斧头”| sed 's/x\s*/x /'

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

echo "x ax" | sed 's/x\s*/x /'

由于某种原因,它不是用单个空格替换空格,而是只是将一个空格附加到之前存在的多个空格上:

x  ax

无论我如何使用该标志,使用+代替似乎绝对没有任何意义。*-E

看起来它sed不执行非贪婪表达式,那么为什么它*在匹配时不会消耗所有空格呢?

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

答案1

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

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

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

答案2

我认为您混淆了 sed 和 grep 标志。 -E 是扩展正则表达式的 grep 标志。 -r 是扩展正则表达式的 sed 标志。以下对我有用:

echo "x     ax" | sed -r 's/x\s*/x /'

它产生

x ax

相关内容