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

#1 楼

字符类\s将匹配空白字符<tab><space>。例如,

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


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


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

评论


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

–停止莫妮卡·赛利奥(Monica Cellio)
2011-09-12 14:44

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

– HUB
2012年5月16日15:12

对于Apple的sed,我不得不使用[[:space:]],因为\ s对我不起作用。也许\ s是GNU sed扩展名?

–Jared Beck
2013年6月17日23:24

@JaredBeck谢谢,我的简单正则表达式无法正常工作的想法已经用尽了。.这很la脚,我以为\ s是标准扩展正则表达式。.-r无效,-E蹲了

– Karthik T
2013年9月11日下午4:58

可以使用[[:blank:]]代替[[:space:]],它只匹配水平制表符和空格(但不匹配换行符,垂直制表符等)。

–stefanct
17-10-13在13:10

#2 楼

这适用于MacOS 10.8:

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


评论


您知道这是否适用于所有Linux发行版吗?

–两栖动物
2014年2月6日在17:26

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

–布拉德·科赫(Brad Koch)
2014年3月18日在21:19

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

–塞缪尔
15年3月21日在0:05

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

– jbo5112
16年1月20日在20:49

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

– mcandre
17-12-29在21:53



#3 楼

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

评论


因此,对于特殊需要,使用老版本的sed,您可以执行以下操作:$ sed's / [XZ] [XZ] [XZ] [XZ] * / / g'输入文件,其中X是制表符,Z是空格。

– Marnix A. van Ammers
2010-4-12 15:08

#4 楼

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


评论


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

–Mokubai♦
2014年7月22日在20:34

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

–内特
14-10-18在4:50

在Mac 10.9.5上,这匹配空格和't'。我使用了上面的Michael Douma来匹配空白字符(它也可以与-e一起使用)。

–外星生命表
15年7月31日在18:32

在我的SUSE系统上无法正常工作。它匹配行中零个或多个空格的第一个位置,该位置在第一个字符之前。我怀疑这是预期的功能,当然不是所要求的用例。我相信您想将'*'更改为'\ +'(或每个问题为'\ {3,\}'),并可能在sed命令的末尾添加一个g以匹配所有出现的模式。如果行中还有其他空格,也可能需要用[[:space:]]替换[\ t]。

– jbo5112
16年1月20日在20:59

无法在我的macOS Catalina上使用

–杰里·格林(Jerry Green)
20年11月5日,19:02

#5 楼

以上都不对我有用。但是我通过使用awk找到了最简单的答案
user@~[]$ cat /tmp/file
/nospace/in/here
/this/one space
/well/seems we have spaces
user@~[]$ cat /tmp/file |awk 'NF>1'
/this/one space
/well/seems we have spaces
user@~[]$