Shell

使用sed時如何保留非空白字元

  • August 16, 2022

我正在使用sed表達式將直引號轉換為彎引號。我想將“Linux 程序員手冊”轉換為“Linux 程序員手冊”。我需要它來檢測在直引號之前和之後是否有非空白字元。如果有,請將直引號替換為彎引號。我試過這個:

sed "s/\S'\S/’/"

但這導致它也替換了非空白字元:

Linux programme’ manual

捕捉它們:

sed -e :1 -e "s/\([^[:space:]]\)'\([^[:space:]]\)/\1’\2/g" -e t1

(這裡使用[^[:space:]]代替非標準的 perl-like \S)。

t1是要涵蓋諸如 之類的輸入,X'Y'Z其中s/.../.../g不會替換Y'ZY’Z因為Y已經是早期替換的一部分。

如果使用perl\S來自哪裡),您可以使用環視運算符:

perl -pe "s/(?<=\S)'(?=\S)/’/g"

一些sed實現確實支持類似 perl 的正則表達式,例如ssedwith-R或 ast-open 的sedwith -P,但不是最常見的sed實現,不是\S建議您使用的 GNU 實現。

您可以執行以下操作,而不是在目前語言環境字元編碼中硬編碼 U+2019 字元:

perl -Mopen=locale -pe "s/(?<=\S)'(?=\S)/\x{2019}/g"

或者:

perl -Mopen=locale -pe "s/(?<=\S)'(?=\S)/\N{RIGHT SINGLE QUOTATION MARK}/g"

根據呼叫腳本的使用者的語言環境'將 替換為編碼的。例如,在 ISO8859-7 希臘單字節字元集中編碼為一個 0xa2 字節,在 UTF-8 中編碼為 0xe2 0x80 0x99,在 BIG5 或 BIG5-HKSCS 中編碼為 0xa1 0xa6。

引用自:https://unix.stackexchange.com/questions/713840