使用“sed”时如何保留非空白字符

使用“sed”时如何保留非空白字符

我正在使用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'ZY’ZY

如果使用perl(where \Scomes from),您可以使用环视运算符:

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

某些sed实现确实支持类似 perl 的正则表达式,例如ssedwith-R或 ast-open 的sedwith -P,但不是最常见的实现,也不是建议您使用的sedGNU 实现。\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。

相关内容