Kann ich im Befehl grep [: digit:] in [0-9] ändern?

Antworten:

15

Nein, [0-9]ist nicht dasselbe wie [:digit:].

[0-9] entspricht den Ziffern 0 bis 9.

[:digit:] entspricht 0 bis 9 und auch Ziffern in nicht-westlichen Sprachen (z. B. Ostarabisch).

Guido
quelle
Könnten Sie bitte einen bestimmten Namen oder einen Link (mit einer Tabelle) zu dem (vorzugsweise) kürzesten solchen Zeichensatz angeben?
Agc
Sind Sie sich auch sicher, dass '[0-9]' immer nur mit 0 bis 9 übereinstimmt ? Vielleicht zieht '[0-9]' in einem anderen Zeichensatz andere Zeichen ein.
Agc
3
@agc [0-9]entspricht den wörtlichen ASCII-Zeichen "0", "1", ..., "9", genauso wie die [A-Z]ASCII-Zeichen "A" bis "Z". Diese Muster sind per Definition auf den ASCII-Zeichensatz beschränkt. [:digit:]Bezeichnet andererseits eine breitere Zeichenklasse , die auch Unicode-Zeichen für Ziffern in anderen Sprachen enthält.
Guido
4
[charX-charY]impliziert einen Bibliothekscode auf niedriger Ebene, der den Zeichencode für charX im aktuellen Zeichensatz nachschlägt und von dort bis zum Code für charY zählt . [A-Z]auf einem ASCII-System entspricht 26 Codes: {65, ... 90}. EBCDIC entspricht 41 Codes: {193, ... 233}. [:upper:]würde immer nur 26 Codes auf ASCII, EBCDIC usw. abgleichen. Zum Glück werden [0-9]10 Codes mit ASCII- oder EBCDIC-Codes abgeglichen - was ungewiss ist, ob Zeichensätze existieren (oder existieren sollen), für die [0-9]mehr als oder weniger als 10 Codes übereinstimmen. Wenn eine solche Menge existiert, [:digit:]ist nützlich.
Agc
4
@Guido Entspricht [A-Z]manchmal tatsächlich mehr als ASCII-Buchstaben: unix.stackexchange.com/questions/15980/… Andererseits denke ich, dass alle vorhandenen Gebietsschemas [0-9]nur mit den ASCII-Ziffern übereinstimmen.
Gilles 'SO - hör auf böse zu sein'
3

Um genau zu sein, [0-9]ist dies nur dann garantiert, [:digit:]wenn:

  • Der Regexp-Parser unterstützt [:digit:](dh wenn dies nicht der Fall ist, tut der vorhandene [:digit:]wahrscheinlich nicht das, was Sie denken) und:

  • Der eingegebene Zeichensatz ist ein ASCII-Zeichensatz, bei dem die einzigen Ziffern die Zeichen sind 0- 9und sie sind benachbart. Dies ist möglicherweise nicht der Fall in (z. B.) Unicode (wo die Ziffern andere Zeichen als die Ziffern enthalten können 0- 9) oder sogar in anderen 8-Bit-Zeichensätzen, in denen 0- 9möglicherweise nicht benachbart sind (wie es in EBCDIC geschieht, sind die Ziffern 0- 9benachbart). .

Beispiele für Unicode-Ausnahmen werden hier gezeigt . Wie Sie sehen können, enthält der Satz von Unicode-Zeichen in der Kategorie 'Zahl, Ziffer, Dezimalzahl' eher mehr als die 10 ASCII-Ziffern, die mit übereinstimmen [0-9]. es enthält arabische Zeichen, erweitertes Arabisch, NGO usw.

Weitere Informationen zu Ziffern in Unicode finden Sie hier .

abligh
quelle
Die ASCII-Ziffern sind benachbart und in allen vorhandenen Gebietsschemas in Ordnung. Dies [0-9]ist eine sichere Möglichkeit, sie abzugleichen.
Gilles 'SO - hör auf böse zu sein'
@ Gilles sind in ASCII benachbart, aber nicht in allen 8-Bit-Zeichensätzen. Und es ist nicht wahr, dass alle Ziffern in Unicode benachbart sind (da es andere Ziffern als gibt [0-9])
abligh
2

Sie können [[:digit:]]zu [0-9]- note [:digit:]is inside wechseln […]. Dies hängt von der Codierung der Eingabe ab. Wenn es ASCII ist, glaube ich nicht, dass es ein Problem geben wird. Bei anderen Codierungen sind die Ziffern möglicherweise nicht zusammenhängend, oder der Bytebereich unterscheidet sich möglicherweise. Sie könnten auch spezielle Nummern in anderen Schriftsystemen verpassen.

muru
quelle
1

'[: digit:]' ist theoretisch portabler, mit dem Vorteil, dass es nicht davon abhängt, ob der lokale Zeichensatz alle Ziffern zusammenklumpt.

In Verbindung stehendes Beispiel: Mit '[: Upper:]' vs '[AZ]' gibt es keinen Unterschied in ASCII, aber es gibt einen Unterschied auf einem alten IBM EBCDIC- System, bei dem '[AZ]' 41 Zeichen umfassen würde, nicht 26 (EBCDIC) Codes 193-233) und würde daher mit EBCDIC "}" et al.

agc
quelle