SED 和 Unicode 引号

SED 和 Unicode 引号

针对此字符串进行测试时:

“… so that’s that… ”

以下内容应该与左引号以及后面的省略号和空格匹配,但并不匹配:

sed "s/\([“‘\"']…\) /\1/g"

但是,这正确匹配了第二个省略号以及后面的空格和右引号:

sed "s/… \([”’\"'.!?]\)/…\1/g"

如果我把第一个分开,它就可以正常工作:

sed -e "s/\(“…\) /\1/g" \
-e "s/\(‘…\) /\1/g" \
-e "s/\(\"…\) /\1/g" \
-e "s/\('…\) /\1/g"

那么为什么当它们组合在一起时不起作用呢?特别是当它与结束引号一起使用时可以正常工作。

答案1

您使用的是哪个版本sed?我相信 GNU sed 应该支持 Unicode 字符,并且您的示例在 Linux(Ubuntu,具有 UTF-8 环境)上对我有用。

如果您使用的 sed 版本不支持 Unicode,则您的字符组会中断,因为它仅匹配一个字节。如果您的命令行使用的是 UTF-8 编码,当您说不支持 Unicode 的 sed 实际上会看到三个字节时,\xE2\x80\x9C这会弄乱您的字符组,一次只能匹配其中一个字节。其他各种构造也会失败,例如,a”?字母“a”后面是两个字节,然后是可选的第三个字节,因此a它本身无法匹配表达式,尽管它看起来应该匹配。

(您可能还需要考虑用三个句点替换省略号。省略号是 Unicode 中的兼容字符;通常认为,写出句点并让字体负责排版更为现代。)

相关内容