用 Linux sed 命令替換智能引號(hào)
用你喜歡的 sed 版本去除“智能”引號(hào)。
在排版學(xué)中,一對(duì)引號(hào)傳統(tǒng)上是朝向彼此的。它們看起來(lái)像這樣:
- “智能引號(hào)”
隨著計(jì)算機(jī)在二十世紀(jì)中期的普及,這種朝向往往被放棄了。計(jì)算機(jī)的原始字符集沒(méi)有太多的空間,所以在 ASCII 規(guī)范中,兩個(gè)雙引號(hào)和兩個(gè)單引號(hào)被縮減為各一個(gè)是合理的。如今,通用的字符集是 Unicode,有足夠的空間容納許多花哨的引號(hào)和撇號(hào),但許多人已經(jīng)習(xí)慣了開頭和結(jié)尾引號(hào)都只有一個(gè)字符的極簡(jiǎn)主義。此外,計(jì)算機(jī)實(shí)際上將不同種類的引號(hào)和撇號(hào)視為不同的字符。換句話說(shuō),對(duì)計(jì)算機(jī)來(lái)說(shuō),右雙引號(hào)與左雙引號(hào)或直引號(hào)是不同的。
用 sed 替換智能引號(hào)
計(jì)算機(jī)并不是打字機(jī)。當(dāng)你按下鍵盤上的一個(gè)鍵時(shí),你不是在按一個(gè)帶有印章的控制桿。你只是按下一個(gè)按鈕,向你的計(jì)算機(jī)發(fā)送一個(gè)信號(hào),計(jì)算機(jī)將其解釋為一個(gè)顯示特定預(yù)定義字符的請(qǐng)求。這個(gè)請(qǐng)求取決于你的鍵盤映射。作為一個(gè) Dvorak 打字員,我目睹了人們?cè)诎l(fā)現(xiàn)我的鍵盤上的 “asdf” 在屏幕上產(chǎn)生 “aoeu” 時(shí)臉上的困惑。你也可能按了一些特殊的組合鍵來(lái)產(chǎn)生字符,如 ™ 或 ß 或 ≠,這甚至沒(méi)有印在你的鍵盤上。
每個(gè)字母或字符,不管它是否印在你的鍵盤上,都有一個(gè)編碼。字符編碼可以用不同的方式表達(dá),但對(duì)計(jì)算機(jī)來(lái)說(shuō),Unicode 序列 u2018 和 u2019 產(chǎn)生 ‘ 和 ’,而代碼 u201c 和 u201d 產(chǎn)生 “ 和 ” 字符。知道這些“秘密”代碼意味著你可以使用 sed 這樣的命令以編程方式替換它們。任何版本的 sed 都可以,所以你可以使用 GNU sed 或 BSD sed,甚至是 Busybox sed。
下面是我使用的簡(jiǎn)單的 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,然后創(chuàng)建一個(gè)包含智能引號(hào)的單獨(dú)測(cè)試文件:
- ‘Single quote’
- “Double quote”
運(yùn)行該腳本,然后使用 cat 命令查看結(jié)果:
- $ sh ./fixquotes.sh test.txt
- $ cat test.txt
- 'Single quote'
- "Double quote"
安裝 sed
如果你使用的是 Linux、BSD 或 macOS,那么你已經(jīng)安裝了 GNU 或 BSD 的 sed。這是原始 sed 命令的兩個(gè)獨(dú)特的重新實(shí)現(xiàn),對(duì)于本文中的腳本來(lái)說(shuō),它們?cè)诠δ苌鲜且粯拥?不過(guò)并不是所有的腳本都是這樣)。
在 Windows 上,你可以用 Chocolatey 安裝 GNU sed。