用Linux sed命令替换智能引号的方法

286 阅读2分钟

在排版学中,一对引号传统上是朝向彼此的。它们看起来像这样。

"智能引号"

随着计算机在二十世纪中叶的普及,这种方向往往被放弃了。计算机的原始字符集没有太多的空间,所以在ASCII规范中,两个双引号和两个单引号被缩减为各一个是合理的。如今,通用的字符集是Unicode,有足够的空间容纳许多花哨的引号和撇号,但许多人已经习惯了开头和结尾的引号都只有一个字符的极简主义。此外,计算机实际上将不同种类的引号和撇号视为不同的字符。换句话说,对计算机来说,右双引号与左双引号或直引号是不同的。

用sed替换智能引号

计算机并不是打字机。当你按下键盘上的一个键时,你不是在按一个连着墨印的杠杆。你只是按下一个按钮,向你的计算机发送一个信号,计算机将其解释为一个显示特定预定义字符的请求。这个请求取决于你的键盘图。作为一个Dvorak打字员,我目睹了人们发现我键盘上的 "asdf "在屏幕上产生 "aoeu "时脸上的困惑。你也可能按了一些特殊的组合键来产生字符,如™或ß或≠,这甚至没有印在你的键盘上。

每个字母或字符,不管它是否印在你的键盘上,都有一个编码。字符编码可以用不同的方式表达,但对计算机来说,Unicode序列u2018和u2019产生**'',而编码u201c和u201d产生""字符。知道这些 "秘密 "代码意味着你可以使用sed这样的命令以编程方式替换它们。任何版本的sed都可以,所以你可以使用GNU sed或BSD sed甚至Busyboxsed。

下面是我使用的简单的shell脚本。

#!/bin/sh
# GNU All-Permissive License
SDQUO=$(echo -ne '\u2018\u2019')
RDQUO=$(echo -ne '\u201C\u201D')
$SED -i -e "s/[$SDQUO]/\'/g" -e "s/[$RDQUO]/\"/g" "${1}"

将这个脚本保存为fixquotes.sh ,然后创建一个单独的包含智能引号的测试文件。

‘Single quote’
“Double quote

运行该脚本,然后使用cat命令查看结果。

$ sh ./fixquotes.sh test.txt
$ cat test.txt
'Single quote'
"Double quote"

安装sed

如果你使用Linux、BSD或macOS,那么你已经安装了GNU或BSD的sed 。这是对原始sed 命令的两个独特的重新实现,对于本文中的脚本来说,它们在功能上是一样的(不过并不是所有的脚本都是这样的)。

在Windows上,你可以用Chocolatey 安装GNU sed