如何匹配sed中的空格?

Pet*_*mit 279 sed whitespace

如何匹配 sed 中的空格?在我的数据中,我想匹配所有 3 个以上的后续空白字符(制表符空间)并将它们替换为 2 个空格。如何才能做到这一点?

mru*_*cci 287

字符类\s将匹配空白字符<tab><space>

例如:

$ sed -e "s/\s\{3,\}/  /g" inputFile
Run Code Online (Sandbox Code Playgroud)

将用两个空格替换至少 3 个空格的每个序列。


备注:为了符合 POSIX,请使用字符类[[:space:]]而不是\s,因为后者是 GNU sed 扩展。请参阅sedBRE的 POSIX 规范

  • 对于 Apple 的 `sed`,我不得不使用 `[[:space:]]`,因为 `\s` 对我不起作用。也许 `\s` 是一个 [GNU sed](http://www.gnu.org/software/sed/) 扩展? (53认同)
  • 我还必须添加“-r”开关,它可以启用扩展的正则表达式,使 sed 将“\s”识别为空格。 (30认同)
  • 可以使用`[[:blank:]]`代替`[[:space:]`,它只匹配水平制表符和空格(但不匹配换行符、垂直制表符等)。 (11认同)
  • 啊哈!正是缺少的 -e 开关让我受益。 (8认同)
  • @JaredBeck 谢谢,我的简单正则表达式不起作用的想法已经用完了。 (3认同)
  • 感谢您的反馈。我用指向 POSIX 标准的链接更新了答案。 (2认同)
  • 对我来说`-e` *停止*它工作,但`-r`使它工作(Mint 16)。即从`sed -e -r` 更改为`sed -r` 是我需要做的。但是,此时我正在使用 `[[:space:]]`,因为我无法让 `\s` 工作。 (2认同)

小智 94

这适用于 MacOS 10.8:

sed -E "s/[[:space:]]+/ /g"
Run Code Online (Sandbox Code Playgroud)

  • @Samuel 如果您使用 *,则正则表达式将匹配零个或多个空格,并且您将在每个字符之间获得一个空格,并在每行的每一端都有一个空格。如果您没有 -E 标志,那么您希望 `sed "s/[[:space:]]\+/ /g"` 匹配一个或多个空格。 (5认同)
  • 你知道这是否适用于所有 Linux 发行版吗? (3认同)
  • 通常,[GNU sed](http://www.gnu.org/software/sed/manual/sed.html) 不会有 -E。来自 BSD sed 手册页:“-E、-a 和 -i 选项是非标准的 FreeBSD 扩展,可能在其他操作系统上不可用。” (3认同)

Mar*_*ers 15

一些旧版本的 sed 可能无法将 \s 识别为空格匹配标记。在这种情况下,您可以将一个或多个空格和制表符的序列与 '[XZ][XZ]*' 匹配,其中 X 是空格而 Z 是制表符。


小智 15

sed 's/[ \t]*/"space or tab"/'
Run Code Online (Sandbox Code Playgroud)

  • 在 Mac 10.9.5 上,这匹配空格和“t”。我使用上面的 Michael Douma 来匹配空白字符(它也适用于 -e)。 (4认同)
  • 这是否保证适用于任何系统上的任何版本的“sed”?如果不是,可能值得一提的是,这与其他答案的工作方式相似,只是为了让我们知道局限性以及可能没有预期结果的地方。 (3认同)
  • 这个 RE 是我用来匹配空格的。仅匹配制表符或空格就比字符类更简单。它仅使用正则表达式的最基本约定,因此它应该可以在任何具有正则表达式功能实现的地方工作。 (3认同)