问:您会发出什么命令来打印(在屏幕上显示)userNotes.txt 的更正文本,并且所有句子结尾在下一个句子开始之前都需要两个空格?
这是我的代码
sed 's/.\s/.\s\s/'
但这也将以点和 2 个空格结尾的行更改为点和 3 个空格。
答案1
sed 's/\.[[:space:]]\{1,\}/. /g'
将替换一个点(与\.
或匹配[.]
,记住.
匹配任何字符),后跟一个或多个空白字符([[:space:]]
与 的标准等效\s
),.
后跟两个空格。
您可能还想这样!
做?
:
sed 's/\([.!?]\)[[:space:]]\{1,\}/\1 /g'
使用最新版本的 GNU sed
,您可以将其缩短为:
sed -E 's/([.!?])\s+/\1 /g'
或者与perl
:
perl -lne 's/[.!?]\K\s+/ /g'
[[:space:]]
并\s
匹配任何空白字符(尽管perl
仅限于 ASCII 字符)。其中包括 CR 字符,尽管这些字符出现在 MS-DOS 文本文件的行尾,但通常不用作空格。因此,如果应用于 MS-DOS 格式的文件,这些命令最终可能会破坏 MS-DOS 行分隔符。
您可以使用不包含 CR 的/来代替[[:space:]]
/ (受支持,但 GNU 不支持)。\s
[[:blank:]]
\h
\h
perl
sed
答案2
假设您的文本保存在名为“file”的文件中,那么您可以awk
按如下方式使用
cat file
this is OK: Turn the knob. Push the \u201con\u201d button. This is not: Turn the knob. Push the \u201con\u201d button.
awk '$1=$1' OFS=" " file
或sed
如下:
sed -E "s/[[:space:]]+/ /g" file