Shell使用
使用sed
時如何保留非空白字元
我正在使用
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'Z
,Y’Z
因為Y
已經是早期替換的一部分。如果使用
perl
(\S
來自哪裡),您可以使用環視運算符:perl -pe "s/(?<=\S)'(?=\S)/’/g"
一些
sed
實現確實支持類似 perl 的正則表達式,例如ssed
with-R
或 ast-open 的sed
with-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。