使用 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

知识共享许可协议本作品根据知识共享署名-相同方式共享 4.0 国际许可协议获得许可。
© . All rights reserved.