如何匹配sed中的空格?


218

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

Answers:


226

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

例如:

$ sed -e "s/\s\{3,\}/  /g" inputFile

将至少三个空格的每个序列替换为两个空格。


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


5
啊哈!正是缺少的-e开关吸引了我。
sequoia mcdowell

25
我还必须添加“ -r”开关,该开关允许扩展的正则表达式使sed识别“ \ s”为空格。
HUB 2012年

39
在苹果公司,sed我不得不使用它,[[:space:]]因为\s它对我不起作用。也许\sGNU sed扩展?
杰里德·贝克

2
@JaredBeck感谢,被运行的想法,为什么我的简单的regex wasnt工作。这是瘸子,我以为\ S是标准的扩展正则表达式。也-r不工作和-E做下蹲
KARTHIK牛逼

3
[[:space:]不能使用[[:blank:]]仅匹配水平制表符和空格(但不包括换行符,垂直制表符等)的替代方法。
stefanct

67

这适用于MacOS 10.8:

sed -E "s/[[:space:]]+/ /g"

2
您知道这是否适用于所有Linux发行版吗?
两栖游戏,2014年

2
通常,GNU sed不会具有-E。在BSD sed手册页中:“ -E,-a和-i选项是非标准的FreeBSD扩展,可能在其他操作系统上不可用。”
布拉德·科赫

1
为什么+运算符需要-E标志?大多数表达式都可以用*代替,然后在其他平台上也可以使用。
塞缪尔

5
@Samuel如果使用*,则正则表达式将匹配零个或多个空格,并且您将在每个字符之间获得一个空格,并在每行的每一端获得一个空格。如果没有-E标志,则要sed "s/[[:space:]]\+/ /g"匹配一个或多个空格。
jbo5112 '16

1
FWIW,NetBSD的sed也支持该-E标志。
mcandre

13

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


1
因此,对于特殊的需要,可以使用旧的sed:$ sed's / [XZ] [XZ] [XZ] [XZ] * / / g'输入文件,其中X是制表符,Z是空格。
Marnix A. van Ammers,2010年

10
sed 's/[ \t]*/"space or tab"/'

2
是否保证可以sed在任何系统的任何版本上使用?如果不是这样,可能值得一提的是它在哪些方面的工作方式与其他答案类似,因此我们知道了局限性以及在哪些方面可能没有预期的结果。
Mokubai

2
这是我用来匹配空白的RE。它比仅匹配制表符或空格的字符类要简单。它仅使用正则表达式的最基本约定,因此它应在具有正则表达式功能实现的任何地方使用。
内特2014年

3
在Mac 10.9.5上,这匹配空格和't'。我使用上面的Michael Douma来匹配空白字符(它也与-e一起使用)。
外星人生命表格

在我的SUSE系统上无法正常工作。它匹配行中零个或多个空格的第一个位置,该位置在第一个字符之前。我怀疑这是预期的功能,当然不是所要求的用例。我相信您想将'*'更改为'\ +'(或每个问题为'\ {3,\}'),并可能在sed命令的末尾添加a来匹配所有出现的模式。如果行中还有其他空格,也可能需要用[[:space:]]替换[\ t]。
jbo5112 '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.