使用 Linux sed 命令替换弯引号

使用您最喜欢的 sed 版本消除“弯引号”。
30 位读者喜欢这个。
Coding on a computer

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

“弯引号”

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

 

 

使用 sed 替换弯引号

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

每个字母或字符,无论是否印在您的键盘上,都有一个代码。字符编码可以用不同的方式表示,但对于计算机而言,Unicode 序列 u2018 和 u2019 产生 ,而代码 u201c 和 u201d 产生 字符。了解这些“秘密”代码意味着您可以使用类似 sed 的命令以编程方式替换它们。任何版本的 sed 都可以,因此您可以使用 GNU sed 或 BSD sed 甚至 Busybox sed。

这是我使用的简单 shell 脚本

#!/bin/sh
# GNU All-Permissive License
SED=$(which sed)
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

接下来阅读什么
标签
Seth Kenlon
Seth Kenlon 是一位 UNIX 极客、自由文化倡导者、独立多媒体艺术家和 D&D 爱好者。他曾在电影和计算机行业工作,而且常常同时进行。

3 条评论

我更喜欢术语“印刷体引号”。在 Scribus 中,我们遇到了相反的问题 - 将打字机引号转换为印刷体。

太棒了,解释在哪里?

`echo` 解释

* `-n` - 无新行
* `-e` - 启用对“\”的解释

我怎么知道 \u2018 是“左单引号”?这些代码可以在 `gnome-characters` 应用程序或 https://www.unicodepedia.com/unicode/general-punctuation/2018/left-single-quotation-mark/ 等网站上找到

所以最终变量被赋值:$SDQUO="‘’"; $RDQUO="“”"

`sed` 解释

* `-i` - “就地”编辑文件(覆盖)
* `-e` - 执行脚本

脚本 1: "s/[‘’]/\'/g"

脚本 2: "s/[“”]/\"/g"

* `s/text_to_find/replace_text/g` - 搜索 (`s/`) "text_to_find" 并将其替换为 "replace_text",并对每次出现都执行此操作 (`/g`)
* text_to_find=`[‘’]` - 应该找到的字符
* replace_text=`'` 和 `"` - 应该替换为的字符。在脚本中,字符表示为 `\'` 和 `\"`,因为 `'` 和 `"` 是特殊字符,为了禁用它们的“特殊功能” - 它们需要以 `\` 开头。

唉... 解释起来不容易... 可能我的解释不够精确,需要... 进一步解释:) 无论如何,对于像我这样的“初学者脚本编写者”来说 - 现在应该更容易理解了 ;)

这是对文章的精彩解构。有关如何使用 sed 的更多信息,请查看以下文章

https://open-source.net.cn/article/20/12/sed

https://open-source.net.cn/article/21/3/sed-cheat-sheet

回复 作者 Danniello

© 2025 open-source.net.cn. All rights reserved.