问题描述

第一次使用 markdown 开始,中英文之间的空格就是让我头疼的一个问题。在使用 latex 时,中英文之间的空格会自动处理。这让我以为撰写其它格式的文档时也会有相同的处理方式,可我最终发现这不过是我自己一厢情愿的想法罢了。

我做的尝试

全半角的切换

今天,我开始尝试解决这个问题。经过一系列的努力发现我其实可以通过半角与全角的切换来完成。

以前我一直使用全角标点,这样造成的问题是在进行中英文混排时,中英文的切换频繁,效率低下。中英文之间的空格也让我头疼不已。

今天我发现,可以通过将符号调整为半角来提高输入的效率。当使用半角符号时,输入的空格为标准空格,在中文模式下也可以直接输入英文。当使用全角时,中文输入模式下的空格为全角空格,输入一个半角空格需要切换输入模式为英文。这算是一大改善吧!

尝试使用 sed 来解决

我也尝试使用 sed 来解决这个问题。不过由于 sed 对于 unicode 的匹配支持的相对薄弱,我无法找到一个直接的方式来处理中英文之间的空格。多次尝试无果后,我决定换一种思路,使用反向选择的方式来解决这个问题。

我想既然我不能直接匹配到中文字符,那么我能不能通过反向匹配除了中文之外的字符来达成呢?事实证明这一点能够做到。依靠 POSIX 字符类我就能使用反向匹配来匹配到中文字符。

这里我首先将自己已经排版好的文章转换为缺少空格的内容。使用的 sed 命令如下

s/\([[:upper:][:lower:][:digit:][:punct:]]\+\)[  ]\+\([^[:upper:][:lower:][:space:][:punct:][:digit:]]\)/\1\2/g
s/\([^[:upper:][:lower:][:space:][:punct:][:digit:]]\)[  ]\+\([[:upper:][:punct:][:lower:][:digit:]]\+\)/\1\2/g

添加空格的命令如下:

s/\([[:upper:][:lower:][:digit:]]\+\)\([^[:upper:][:lower:][:space:][:punct:][:digit:]]\)/\1 \2/g 
 s/\([^[:upper:][:lower:][:space:][:punct:][:digit:]]\)\([[:upper:][:lower:][:digit:]]\+\)/\1 \2/g

局限性

由于 [:punct:] 会匹配半角与全角符号,在中文环境中全角符号后不需要添加空格,半角符号前后需要添加空格。对半角符号前后空格的添加无法使用 POSIX 字符类完成。可以使用普通字符类完成。