用一个空格替换句子结尾后两个空格的所有出现


9

我陷入了sed命令包含正则表达式的困境。

问:我想用一个空格代替句子结尾后两个空格的所有出现。

这是我所做的:

sed 's/^ $/^$/' file  

句子结束后,它没有用一个空格代替两个空格。

我得到的输出:

This is the output.  Hello Hello

我想要的输出:

This is the output. Hello Hello

@Rahul我希望句子结尾后的输出包含一次空格。没有第一句中的两个空格。我要输出第二句话
宙斯

@Jasen的答案是正确的。顺便说一句,您尝试的命令的意思是:用空行替换仅包含一个whitspace的行。这就是为什么它没有做您想要的。
rexkogitans

1
在此处插入:停顿后在单人空间与双人空间上的战争
Gerrit

@gerrit那场战争在20年前就输了。;)
h4ckNinja

Answers:


12
 sed 's/\.   */. /g' < file

将点后跟两个或多个空格替换为点后跟一个空格。


您的命令实际上适用于整个段落。那正是我想要的。谢谢!
宙斯

sed -r 's/\.\s+/. /g' file与GNU sed一起使用
Sundeep

@spasic使用sed -E而不是sed -r。可以与GNU sed和* BSD sed(包括Mac OS X)一起使用。它计划“立即真正”作为标准包含在POSIX中。
cas

@cas我记得曾经有一段时间,我sed -E向这个网站上的某个人提出了建议,该人虽然没有用但是有用sed -r。 ,谢谢:)
Sundeep

它一定是GNU sed的旧版本。他们已经支持-E了很长一段时间(至少从2011年开始,但是man和info页面仍然只提到了-r
cas

13

您的sed命令's/^ $/^$/'不会执行您想要的操作。它只是将包含一行的所有行替换为包含一行的行^$

根据哪些字符标记了句子的结尾,您可以执行以下操作:

sed -e 's/\([.?!]\) \{2,\}/\1 /g' <file

这将在之后替换2个或多个空格.?或者!仅替换一个空格。


1
可以缩短为sed -r 's/([.?!])\s+/\1 /g' file
Sundeep

谢谢。但是,请您详细说明为什么要使用这么多的圆形方括号?有点混乱。
宙斯

1
@spasic:仅与GNU sed一起使用,已更新为简化版本。
cuonglm '16

@Zeus:这是默认BRE的标准语法。
cuonglm '16

1
不,原始sed编辑脚本将用文字字符串替换包含单个空格的任何行^$
库沙兰丹

7

这就是您要寻找的

tr -s " " <filename

样品,

$ echo "This is the output.  Hello Hello" | tr -s "[:blank:]"
This is the output. Hello Hello

使用sed

$ echo "This is the output.  Hello Hello" | sed 's/\. \+/. /g'
$ echo "This is the output.  Hello Hello" | sed 's/\. \{1,\}/. /g'
This is the output. Hello Hello

2
好吧,这很正常,谢谢,但是我需要包括sed命令。请告诉类似上面显示的内容,例如sed中的替换,更改文本等。
宙斯

2
我不知道这个tr功能,
Jasen 2016年

3
这种方法还将替换两个不是句子结尾的空格。
cuonglm '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.