如何使用sed匹配数字后跟一个点?

Mik*_* H. 122 regex sed

我正在尝试使用sed数字后跟一个点(例如3., 355.)和一个空字符串来替换所有模式。所以我尝试:

sed 's/\d+\.//g' file.txt
Run Code Online (Sandbox Code Playgroud)

但它不起作用。这是为什么?

gle*_*man 166

因为 sed 不是 perl —— sed 正则表达式没有\d速记:

sed 's/[[:digit:]]\+\.//g'
Run Code Online (Sandbox Code Playgroud)

sed 正则表达式文档在这里

  • 那就是如果你想要*零*或更多数字。`/[[[:digit:]]*\. /` 将匹配字符串 `foo.`,因为您允许使用零位数字。如果你想要*一个*或更多,请使用`\+`,如图所示 (5认同)
  • 那不是很规律,是吗? (4认同)

cho*_*oba 101

两个问题:

  1. sed不支持\d。使用[0-9][[:digit:]]

  2. +必须反斜杠才能获得特殊含义:\+.

  • 好吧......它确实看起来像`sed`在可移植性方面很糟糕...... (16认同)
  • 您可以使用 -E 选项将正则表达式解释为扩展(现代)正则表达式而不是基本正则表达式(BRE 的),而不是反斜杠(例如,它不适用于 Mac OS X)。 遗憾的是,这对 \d 问题没有帮助...... (14认同)
  • @gmale:`-E` 不适用于 GNU sed,它使用 `-r` 代替。 (6认同)
  • 基本上,我试图警告人们的是:如果您不使用扩展正则表达式(BSD sed 上使用“-E”,GNU sed 上使用“-r”),则在 BSD sed 中,既不使用“+”也不使用“\+” (与“?”相同)完全可以工作,而在 GNU sed 中你可以让它们与反斜杠一起工作。因此,普遍建议在脚本编写中使用扩展正则表达式 (2认同)

ti7*_*ti7 12

几年后添加到其他答案中,我发现我想要更复杂的正则表达式的扩展功能

这仅需要+一个或多个,并且通常使我的情况和这个情况下的字符串对我来说更加明显

# NOTE \d is not supported
sed --regexp-extended 's/[0-9]+\.//g'
Run Code Online (Sandbox Code Playgroud)

-E -r --regexp-extended都一样

使用sed4.7


小智 6

sed 手册页引用了 re_format 手册页。它有两个区别:(1) 过时的与扩展的正则表达式;(2) 非增强型与增强型正则表达式。所有 4 种组合都是可能的。sed 支持过时和扩展,但在任何一种情况下都只支持非增强。\d 运算符是增强型正则表达式的一项功能,因此不受 sed 支持。