我想找到一个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
。
在您的实现中,看起来\s
matches s
,因此\s*
匹配 0 或多个s
,并且在您的示例输入中x\s*
匹配,因此被转换为(并将被转换为等等)。在其他实现中(例如使用 GNU sed),matches , so匹配后跟 0 或更多的反斜杠,这不会出现在您的输入中,因此该行保持不变。x
x ax
x ax
xy
x y
\s
\s
\s*
s
这和贪婪完全没有关系。贪婪不会影响字符串是否与正则表达式匹配,只会影响匹配捕获字符串的哪一部分。
答案2
我认为您混淆了 sed 和 grep 标志。 -E 是扩展正则表达式的 grep 标志。 -r 是扩展正则表达式的 sed 标志。以下对我有用:
echo "x ax" | sed -r 's/x\s*/x /'
它产生
x ax