SED- und Unicode-Anführungszeichen

3485
Jonathan Patt

Beim Testen gegen diese Zeichenfolge:

“… so that’s that… ” 

Folgendes sollte mit dem Anfangsanführungszeichen und den folgenden Auslassungspunkten und Leerzeichen übereinstimmen, muss jedoch nicht übereinstimmen:

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

Dies stimmt jedoch korrekt mit der zweiten Ellipse und dem folgenden Leerzeichen und dem schließenden Anführungszeichen überein:

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

Wenn ich das erste auseinander spalte, funktioniert es gut:

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

Warum funktioniert es nicht, wenn es zusammen gruppiert ist? Besonders, wenn es mit den schließenden Anführungszeichen gut funktioniert.

0
Ich könnte mich darüber irren, aber in der zweiten sed - Anweisung (sed "s / ... \\ ([" '\ "'.!?] \\) / ... \ 1 / g") ist der "Punkt" (in Die eckigen Klammern (vor dem! und?) sollten mit jedem Zeichen übereinstimmen, da es nicht mit Escapezeichen versehen wurde. Sie suchen also nach den Ellipsen, gefolgt von einem Leerzeichen, gefolgt von einem beliebigen Zeichen (oder einem der anderen aufgelisteten Zeichen). Creepygeek vor 14 Jahren 0
Soweit ich das beurteilen kann, scheint das nicht der Fall zu sein - die Periode scheint nicht als Platzhalter zu wirken, wenn sie in den eckigen Klammern steht. Jonathan Patt vor 14 Jahren 0

1 Antwort auf die Frage

1
bobince

Welche Version verwenden sedSie? Ich glaube, dass GNU sed Unicode-Zeichen unterstützen sollte, und Ihr Beispiel funktioniert für mich unter Linux (Ubuntu, mit UTF-8-Umgebung).

Wenn Sie eine Version von sed verwenden, die nicht Unicode-fähig ist, wird Ihre Zeichengruppe beschädigt, da sie nur einem Byte entspricht. Wenn Ihre Befehlszeile eine UTF-8-Codierung verwendet, würde ein nicht Unicode-fähiger sed tatsächlich drei Bytes \xE2, \x80und anzeigen \x9C. Dies würde Ihre Charaktergruppe zusammenfassen, die jeweils nur einem dieser Bytes entspricht. Verschiedene andere Konstrukte würden ebenfalls versagen, z. a”?Ist der Buchstabe 'a' dann zwei Bytes gefolgt von einem optionalen dritten Byte, so awürde der Ausdruck alleine nicht mit dem Ausdruck übereinstimmen, obwohl er so aussieht, als sollte er aussehen.

(Möglicherweise möchten Sie auch in Betracht ziehen, das Ellipsenzeichen durch drei Punkte zu ersetzen. Ellipsis ist ein Kompatibilitätszeichen in Unicode; es wird im Allgemeinen als moderner erachtet, die Punkte zu schreiben und den Zeichensatz für den Schriftsatz sorgen zu lassen.)

Ich hatte die Version von Sed verwendet, die mit OS X 10.6 geliefert wird. Ich konnte nicht feststellen, welche Version das ist. Ich habe jedoch gerade die Version "Gsed" installiert, und es funktioniert perfekt. Vielen Dank! In Bezug auf die Auslassungspunkte ist dies für ein persönliches Projekt, bei dem ich die Verwendung von Auslassungszeichen über drei Perioden vorziehen möchte, und wenn nötig, ist es einfach, sie später zu konvertieren. Jonathan Patt vor 14 Jahren 0
Ich denke, Sie haben das rückwärts: `...` ist die Kompatibilitätsversion einer richtigen Ellipse `…`. Es ist nicht moderner, "..." anstelle von "..." zu verwenden, und mit der Ellipse-Glyphe * wird * die Schrift das richtige tun lassen - deswegen ist die Ellipsen-Glyphe da. Andrew Marshall vor 12 Jahren 0