Marcas de Cotação SED e Unicode

0

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.

Jonathan Patt
fonte
Eu poderia estar errado sobre isso, mas na segunda declaração sed (sed "s /… \ ([" '\ "'.!?] \) /… \ 1 / g"), o 'ponto' (na praça parêntesis; antes que o! e?) deve corresponder a qualquer caractere desde que não tenha escapado.Então você está procurando as reticências seguido por um espaço, seguido por qualquer caractere (ou qualquer um dos outros caracteres listados)
Creepygeek
Esse não parece ser o caso, até onde eu sei - o período não parece estar atuando como um curinga quando está entre os colchetes.
Jonathan Patt

Respostas:

1

Qual versão de sedvocê 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, \x80e \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, por asi 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.)

bobince
fonte
Eu estava usando qualquer versão do sedOS X 10.6 - não era capaz de determinar qual versão é -, mas eu acabei de instalar gsede 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.
Jonathan Patt
Acho que você retrocedeu: ...é 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á.
Andrew Marshall