Ao testar contra essa string:
“… so that’s that… ”
Os itens a seguir devem, mas não coincidem, as aspas de abertura e as reticências e espaços a seguir:
sed "s/\([“‘\"']…\) /\1/g"
No entanto, isso corresponde corretamente as reticências segundo e seguinte espaço e aspas de fechamento:
sed "s/… \([”’\"'.!?]\)/…\1/g"
Se eu dividir o primeiro, tudo funciona bem:
sed -e "s/\(“…\) /\1/g" \
-e "s/\(‘…\) /\1/g" \
-e "s/\(\"…\) /\1/g" \
-e "s/\('…\) /\1/g"
Então, por que não funciona quando é agrupado? Especialmente quando funciona bem com as aspas de fechamento.
Respostas:
Qual versão de
sed
você está usando? Eu acredito que o GNU sed deve suportar caracteres Unicode, e seu exemplo funciona para mim no Linux (Ubuntu, com o ambiente UTF-8).Se você estiver usando uma versão do sed que não seja compatível com Unicode, seu grupo de caracteres será interrompido porque corresponde apenas a um byte. Se sua linha de comando estiver usando uma codificação UTF-8, quando você diz que
“
um sed não-compatível com Unicode realmente veria três bytes\xE2
,\x80
e\x9C
. Isso aumentaria seu grupo de caracteres, que corresponderia apenas a um desses bytes por vez. Várias outras construções também falhariam, por exemplo.a”?
é a letra 'a', em seguida, dois bytes seguidos por um terceiro byte opcional, portanto, pora
si só, não corresponderia à expressão, embora pareça que deveria.(Você pode querer considerar também a substituição do caractere de reticências por três pontos. Reticências é um caractere de compatibilidade no Unicode; geralmente é considerado mais moderno gravar os pontos e deixar que a fonte cuide dos diagramas.)
fonte
sed
OS X 10.6 - não era capaz de determinar qual versão é -, mas eu acabei de instalargsed
e funciona perfeitamente lá. Obrigado! Em relação às reticências, isso é para um projeto pessoal em que prefiro o uso de reticências em três períodos e, se necessário, é fácil convertê-los mais tarde....
é a versão de compatibilidade de uma reticência adequada…
. Não é mais moderno usar em...
vez de…
, e usar o glifo de reticências é permitir que a fonte faça a coisa correta - é por isso que o glifo de reticências está lá.