针对此字符串进行测试时:
“… 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 中的兼容字符;通常认为,写出句点并让字体负责排版更为现代。)