我正在使用sed
表达式将直引号转换为弯引号。我想将“Linux程序员手册”转换为“Linux程序员手册”。我需要它来检测直引号前后是否有非空白字符。如果有,则将直引号替换为弯引号。我试过这个:
sed "s/\S'\S/’/"
但这导致它也替换了非空白字符:
Linux programme’ manual
答案1
捕获他们:
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
(where \S
comes from),您可以使用环视运算符:
perl -pe "s/(?<=\S)'(?=\S)/’/g"
某些sed
实现确实支持类似 perl 的正则表达式,例如ssed
with-R
或 ast-open 的sed
with -P
,但不是最常见的实现,也不是建议您使用的sed
GNU 实现。\S
您可以执行以下操作,而不是在当前区域设置字符编码中硬编码 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。