sed: Bis Unicode U+0370 (880) alles loeschen
Ich möchte bis ausschließlich U+0370 (hex) bzw. 880 (dezimal) unter UTF-8 alles löschen. tr dürfte das nicht können. Ich habe das probiert: tr -d '[\0-\879]' Mit sed komme ich mit der Syntax dazu nicht klar. Wie macht man das mit sed? Andere Lösungen als mit sed sind natürlich auch willkommen. Sollte nach U+03FF (1023) unerwarteter Weise noch was bleiben, so sollte das optimalerweise auch noch gelöscht werden, wenn das nicht zu rechenaufwendig ist. Al -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Al Bogner schrieb:
Ich möchte bis ausschließlich U+0370 (hex) bzw. 880 (dezimal) unter UTF-8 alles löschen. tr dürfte das nicht können. Ich habe das probiert:
tr -d '[\0-\879]'
Mit sed komme ich mit der Syntax dazu nicht klar. Wie macht man das mit sed? Andere Lösungen als mit sed sind natürlich auch willkommen.
Sollte nach U+03FF (1023) unerwarteter Weise noch was bleiben, so sollte das optimalerweise auch noch gelöscht werden, wenn das nicht zu rechenaufwendig ist.
Al
Ungetestet: sed -e '/\\U0370/d' für das eine Zeichen, '/\\U0370*/d' bis zum Zeilenende, '/\\U0370/,/$/d' für alle Zeilen ab der ersten Fundstelle. Die Zeile, die das Zeichen enthält, wird dann auch vollständig - inklusiv der Zeichen vom Zeilenanfang bis zur Fundstelle - gelöscht. -- Mit freundlichen Grüßen Martin Blank -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Martin Blank schrieb:
Al Bogner schrieb:
Ich möchte bis ausschließlich U+0370 (hex) bzw. 880 (dezimal) unter UTF-8 alles löschen. tr dürfte das nicht können. Ich habe das probiert:
tr -d '[\0-\879]'
Mit sed komme ich mit der Syntax dazu nicht klar. Wie macht man das mit sed? Andere Lösungen als mit sed sind natürlich auch willkommen.
Sollte nach U+03FF (1023) unerwarteter Weise noch was bleiben, so sollte das optimalerweise auch noch gelöscht werden, wenn das nicht zu rechenaufwendig ist.
Al
Ungetestet: sed -e '/\\U0370/d' für das eine Zeichen, '/\\U0370*/d' bis zum Zeilenende, '/\\U0370/,/$/d' für alle Zeilen ab der ersten Fundstelle. Die Zeile, die das Zeichen enthält, wird dann auch vollständig - inklusiv der Zeichen vom Zeilenanfang bis zur Fundstelle - gelöscht.
Hi, soweit ich verstehe, will Al nicht alle Zeichen in einer Zeile nach U0370 löschen, sondern alle, die im Zeichensatz vor U0370 liegen. Wenn Martins Suchmuster stimmt (ich nutze Unicode nur, wo es nicht zu umgehen ist, da unsere DB latin1 ist), käme dann wohl eher sed -e 's/[\\U0000-\\U0370]//g' in Frage. evt. müssen das "U" und ggf. in den Hexcodes auftauchende Buchstaben "ABCDEF" (für andere Bereiche) _klein_ geschrieben werden. cu jth -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Am Mo, 30 Aug 2010 08:51:55 CEST schrieb Joerg Thuemmler: Jallo Jörg,
Martin Blank schrieb:
Al Bogner schrieb:
Ich möchte bis ausschließlich U+0370 (hex) bzw. 880 (dezimal) unter UTF-8 alles löschen. tr dürfte das nicht können. Ich habe das probiert:
tr -d '[\0-\879]'
Mit sed komme ich mit der Syntax dazu nicht klar. Wie macht man das mit sed? Andere Lösungen als mit sed sind natürlich auch willkommen.
Sollte nach U+03FF (1023) unerwarteter Weise noch was bleiben, so sollte das optimalerweise auch noch gelöscht werden, wenn das nicht zu rechenaufwendig ist.
Al
Ungetestet: sed -e '/\\U0370/d' für das eine Zeichen, '/\\U0370*/d' bis zum Zeilenende, '/\\U0370/,/$/d' für alle Zeilen ab der ersten Fundstelle. Die Zeile, die das Zeichen enthält, wird dann auch vollständig - inklusiv der Zeichen vom Zeilenanfang bis zur Fundstelle - gelöscht.
Hi,
soweit ich verstehe, will Al nicht alle Zeichen in einer Zeile nach U0370 löschen, sondern alle, die im Zeichensatz vor U0370 liegen.
So ist es.
Wenn Martins Suchmuster stimmt (ich nutze Unicode nur, wo es nicht zu umgehen ist, da unsere DB latin1 ist), käme dann wohl eher
sed -e 's/[\\U0000-\\U0370]//g' in Frage.
evt. müssen das "U" und ggf. in den Hexcodes auftauchende Buchstaben "ABCDEF" (für andere Bereiche) _klein_ geschrieben werden.
var="SONDERZEICHEN (Άναψε)" echo "$var" | sed -e 's/[\\U0000-\\U0370]//g' sed: -e Ausdruck #1, Zeichen 22: Das Ende des angegebenen Intervalls ist nicht gültig echo "$var" | tr '[:upper:]' '[:lower:]' | sed -e 's/[\\U0000-\\U0370]//g' sed: -e Ausdruck #1, Zeichen 22: Das Ende des angegebenen Intervalls ist nicht gültig Diese Variante ist für den Fall, dass der Text im Latin-Bereich klein sein sollte. Genau genommen, müsste es U036F sein, da ja U0370 erhalten bleiben soll, aber es kann ausgeschlossen werden, dass das Zeichen vorkommt. echo "$var" | sed -e 's/[\\U0000-\\U036F]//g'sed: -e Ausdruck #1, Zeichen 22: Das Ende des angegebenen Intervalls ist nicht gültig Al -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Joerg Thuemmler schrieb:
Martin Blank schrieb:
Al Bogner schrieb:
Ich möchte bis ausschließlich U+0370 (hex) bzw. 880 (dezimal) unter UTF-8 alles löschen. tr dürfte das nicht können. Ich habe das probiert:
tr -d '[\0-\879]'
Mit sed komme ich mit der Syntax dazu nicht klar. Wie macht man das mit sed? Andere Lösungen als mit sed sind natürlich auch willkommen.
Sollte nach U+03FF (1023) unerwarteter Weise noch was bleiben, so sollte das optimalerweise auch noch gelöscht werden, wenn das nicht zu rechenaufwendig ist.
Al
Ungetestet: sed -e '/\\U0370/d' für das eine Zeichen, '/\\U0370*/d' bis zum Zeilenende, '/\\U0370/,/$/d' für alle Zeilen ab der ersten Fundstelle. Die Zeile, die das Zeichen enthält, wird dann auch vollständig - inklusiv der Zeichen vom Zeilenanfang bis zur Fundstelle - gelöscht.
Hi,
soweit ich verstehe, will Al nicht alle Zeichen in einer Zeile nach U0370 löschen, sondern alle, die im Zeichensatz vor U0370 liegen. Wenn Martins Suchmuster stimmt (ich nutze Unicode nur, wo es nicht zu umgehen ist, da unsere DB latin1 ist), käme dann wohl eher
sed -e 's/[\\U0000-\\U0370]//g' in Frage.
Also einen Bereich des Zeichensatzes und nicht der Datei. Dann ist mein Lösungsvorschlag allerdings nicht korrekt. Zum Suchmuster: Ich musste einmal in einer Datei verschiedene Sonderzeichen umsetzen, von denen mir nur ihr Hex-Code, die Darstellung z.B. im emacs und wie sie eigentlich - auf meiner Maschine - aussehen sollten bekannt war. Die Umsetzung nach TeX sah etwa so aus: [...] s/\\u201e/{\\glqq}/g s/\\u201c/{\\grqq}/g s/\xe4/{\\"a}/g [...] Dabei sind die beiden ersten Zeilen wohl die emacs-Darstellung, die letzte die Umsetzung des Hex-Codes.
evt. müssen das "U" und ggf. in den Hexcodes auftauchende Buchstaben "ABCDEF" (für andere Bereiche) _klein_ geschrieben werden.
cu jth
-- Mit freundlichen Grüßen Martin Blank -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Am Mo, 30 Aug 2010 13:53:43 CEST schrieb Martin Blank: Hallo,
Joerg Thuemmler schrieb:
Martin Blank schrieb:
Al Bogner schrieb:
Ich möchte bis ausschließlich U+0370 (hex) bzw. 880 (dezimal) unter UTF-8 alles löschen. tr dürfte das nicht können. Ich habe das probiert:
tr -d '[\0-\879]'
Mit sed komme ich mit der Syntax dazu nicht klar. Wie macht man das mit sed? Andere Lösungen als mit sed sind natürlich auch willkommen.
Sollte nach U+03FF (1023) unerwarteter Weise noch was bleiben, so sollte das optimalerweise auch noch gelöscht werden, wenn das nicht zu rechenaufwendig ist.
Al
Ungetestet: sed -e '/\\U0370/d' für das eine Zeichen, '/\\U0370*/d' bis zum Zeilenende, '/\\U0370/,/$/d' für alle Zeilen ab der ersten Fundstelle. Die Zeile, die das Zeichen enthält, wird dann auch vollständig - inklusiv der Zeichen vom Zeilenanfang bis zur Fundstelle - gelöscht.
Hi,
soweit ich verstehe, will Al nicht alle Zeichen in einer Zeile nach U0370 löschen, sondern alle, die im Zeichensatz vor U0370 liegen. Wenn Martins Suchmuster stimmt (ich nutze Unicode nur, wo es nicht zu umgehen ist, da unsere DB latin1 ist), käme dann wohl eher
sed -e 's/[\\U0000-\\U0370]//g' in Frage.
Also einen Bereich des Zeichensatzes und nicht der Datei. Dann ist mein Lösungsvorschlag allerdings nicht korrekt. Zum Suchmuster: Ich musste einmal in einer Datei verschiedene Sonderzeichen umsetzen, von denen mir nur ihr Hex-Code, die Darstellung z.B. im emacs und wie sie eigentlich - auf meiner Maschine - aussehen sollten bekannt war. Die Umsetzung nach TeX sah etwa so aus:
[...] s/\\u201e/{\\glqq}/g s/\\u201c/{\\grqq}/g s/\xe4/{\\"a}/g [...]
Ich sehe hier keinen Bereich und 800 einzelne Ersetzungen will ich ja gerade nicht machen. Ich überlege auch in Richtung des Vorschlags von Jörg, finde aber nicht heraus was am "-" falsch ist. Al -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Martin Blank schrieb:
Al Bogner schrieb:
Ich möchte bis ausschließlich U+0370 (hex) bzw. 880 (dezimal) unter UTF-8 alles löschen. tr dürfte das nicht können. Ich habe das probiert:
tr -d '[\0-\879]'
Mit sed komme ich mit der Syntax dazu nicht klar. Wie macht man das mit sed? Andere Lösungen als mit sed sind natürlich auch willkommen.
Sollte nach U+03FF (1023) unerwarteter Weise noch was bleiben, so sollte das optimalerweise auch noch gelöscht werden, wenn das nicht zu rechenaufwendig ist.
Al
Ungetestet: sed -e '/\\U0370/d' für das eine Zeichen, '/\\U0370*/d' bis zum Zeilenende, '/\\U0370/,/$/d' für alle Zeilen ab der ersten Fundstelle. Die Zeile, die das Zeichen enthält, wird dann auch vollständig - inklusiv der Zeichen vom Zeilenanfang bis zur Fundstelle - gelöscht.
Es muss natürlich '/\\U0370.*/d' heissen;-) -- Mit freundlichen Grüßen Martin Blank -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Am Mo, 30 Aug 2010 07:54:57 CEST schrieb Martin Blank: Hallo Martin,
Al Bogner schrieb:
Ich möchte bis ausschließlich U+0370 (hex) bzw. 880 (dezimal) unter UTF-8 alles löschen. tr dürfte das nicht können. Ich habe das probiert:
tr -d '[\0-\879]'
Mit sed komme ich mit der Syntax dazu nicht klar. Wie macht man das mit sed? Andere Lösungen als mit sed sind natürlich auch willkommen.
Sollte nach U+03FF (1023) unerwarteter Weise noch was bleiben, so sollte das optimalerweise auch noch gelöscht werden, wenn das nicht zu rechenaufwendig ist.
Al
Ungetestet: sed -e '/\\U0370/d' für das eine Zeichen, '/\\U0370*/d' bis zum Zeilenende, '/\\U0370/,/$/d' für alle Zeilen ab der ersten Fundstelle. Die Zeile, die das Zeichen enthält, wird dann auch vollständig - inklusiv der Zeichen vom Zeilenanfang bis zur Fundstelle - gelöscht.
IMHO hast du ein ganz wichtiges Kriterium übersehen, nämlich den Bereich "aller Zeichen bis", das mein Hauptproblem in der Syntax ist. Beispiel: ~> var="SONDERZEICHEN (Άναψε)" ~> echo "$var" | sed -e '/\\U0370/d' SONDERZEICHEN (Άναψε) ~> echo "$var" | sed -e '/\\U0370*/d' SONDERZEICHEN (Άναψε) ~> echo "$var" | sed -e '/\\U0370/,/$/d' SONDERZEICHEN (Άναψε) Es geht darum, dass Άναψε übrigbleibt, es sollen also nur griechische Zeichen übrig bleiben, _alle_ anderen, und nicht nur ein bestimmtes Zeichen, sollen gelöscht werden. Diese Zeichen sollen also erhalten bleiben: http://de.wikipedia.org/wiki/Unicode-Block_Griechisch_und_Koptisch U+0370 (880) - U+03FF (1023) U+0000 (0) - U+036F (879) soll gelöscht werden. http://de.wikipedia.org/wiki/Liste_der_Unicode-Bl%C3%B6cke Al -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Al Bogner schrieb:
Am Mo, 30 Aug 2010 07:54:57 CEST schrieb Martin Blank:
Hallo Martin,
Al Bogner schrieb:
Ich möchte bis ausschließlich U+0370 (hex) bzw. 880 (dezimal) unter UTF-8 alles löschen. tr dürfte das nicht können. Ich habe das probiert:
tr -d '[\0-\879]'
Mit sed komme ich mit der Syntax dazu nicht klar. Wie macht man das mit sed? Andere Lösungen als mit sed sind natürlich auch willkommen.
Sollte nach U+03FF (1023) unerwarteter Weise noch was bleiben, so sollte das optimalerweise auch noch gelöscht werden, wenn das nicht zu rechenaufwendig ist.
Al
Ungetestet: sed -e '/\\U0370/d' für das eine Zeichen, '/\\U0370*/d' bis zum Zeilenende, '/\\U0370/,/$/d' für alle Zeilen ab der ersten Fundstelle. Die Zeile, die das Zeichen enthält, wird dann auch vollständig - inklusiv der Zeichen vom Zeilenanfang bis zur Fundstelle - gelöscht.
IMHO hast du ein ganz wichtiges Kriterium übersehen, nämlich den Bereich "aller Zeichen bis", das mein Hauptproblem in der Syntax ist.
Beispiel:
~> var="SONDERZEICHEN (Άναψε)"
~> echo "$var" | sed -e '/\\U0370/d' SONDERZEICHEN (Άναψε)
~> echo "$var" | sed -e '/\\U0370*/d' SONDERZEICHEN (Άναψε)
~> echo "$var" | sed -e '/\\U0370/,/$/d' SONDERZEICHEN (Άναψε)
Es geht darum, dass Άναψε übrigbleibt, es sollen also nur griechische Zeichen übrig bleiben, _alle_ anderen, und nicht nur ein bestimmtes Zeichen, sollen gelöscht werden.
Diese Zeichen sollen also erhalten bleiben: http://de.wikipedia.org/wiki/Unicode-Block_Griechisch_und_Koptisch U+0370 (880) - U+03FF (1023)
U+0000 (0) - U+036F (879) soll gelöscht werden. http://de.wikipedia.org/wiki/Liste_der_Unicode-Bl%C3%B6cke
Al
echo "SONDERZEICHEN (Άναψε)" | sed -e 's/[^\xce\x86-\xce\xbf]//g' Άναε Es ist anscheinend grundsätzlich möglich, allerdings: Die Zeichen, die erhalten bleiben sollen, bilden keinen geschlossenen Block. Es sind Lücken vorhanden. In diesen Lücken sind u.a. offensichtlich Zeichen, die nicht im Suchmuster vertreten sein dürfen. Das Ersetzen des rechten Intervallgrenzen 'bf' durch 'c0' führt zu einer Fehlermeldung von sed. Dadurch wird es erforderlich, für jeden Block eigene Intervallgrenzen anzugeben. Ggf. kommen auch noch einzelne Zeichen dazu. -- Mit freundlichen Grüßen Martin Blank -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hi Martin! On Mo, 30 Aug 2010, Martin Blank wrote:
echo "SONDERZEICHEN (Άναψε)" | sed -e 's/[^\xce\x86-\xce\xbf]//g' Άναε
Es ist anscheinend grundsätzlich möglich, allerdings: Die Zeichen, die erhalten bleiben sollen, bilden keinen geschlossenen Block. Es sind Lücken vorhanden. In diesen Lücken sind u.a. offensichtlich Zeichen, die nicht im Suchmuster vertreten sein dürfen. Das Ersetzen des rechten Intervallgrenzen 'bf' durch 'c0' führt zu einer Fehlermeldung von sed.
Dadurch wird es erforderlich, für jeden Block eigene Intervallgrenzen anzugeben. Ggf. kommen auch noch einzelne Zeichen dazu.
Ich weiß nicht, wie es bei sed ist, aber im vi ist es so, dass eine Character Range nicht größer als 256 Zeichen sein kann. Ich denke, es ist im sed genau so und daher rühren diese Fehlermeldungen. regards, Christian -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Christian Brabandt schrieb:
Hi Martin!
On Mo, 30 Aug 2010, Martin Blank wrote:
echo "SONDERZEICHEN (Άναψε)" | sed -e 's/[^\xce\x86-\xce\xbf]//g' Άναε
Es ist anscheinend grundsätzlich möglich, allerdings: Die Zeichen, die erhalten bleiben sollen, bilden keinen geschlossenen Block. Es sind Lücken vorhanden. In diesen Lücken sind u.a. offensichtlich Zeichen, die nicht im Suchmuster vertreten sein dürfen. Das Ersetzen des rechten Intervallgrenzen 'bf' durch 'c0' führt zu einer Fehlermeldung von sed.
Dadurch wird es erforderlich, für jeden Block eigene Intervallgrenzen anzugeben. Ggf. kommen auch noch einzelne Zeichen dazu.
Ich weiß nicht, wie es bei sed ist, aber im vi ist es so, dass eine Character Range nicht größer als 256 Zeichen sein kann. Ich denke, es ist im sed genau so und daher rühren diese Fehlermeldungen.
regards, Christian
Sollte 256 Zeichen nicht ggf. einen Block von \x00 bis \xff umfassen? Das o.g. Intervall ist dann eindeutig kleiner. -- Mit freundlichen Grüßen Martin Blank -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Christian Brabandt schrieb:
Hi Martin!
On Mo, 30 Aug 2010, Martin Blank wrote:
echo "SONDERZEICHEN (Άναψε)" | sed -e 's/[^\xce\x86-\xce\xbf]//g' Άναε
Es ist anscheinend grundsätzlich möglich, allerdings: Die Zeichen, die erhalten bleiben sollen, bilden keinen geschlossenen Block. Es sind Lücken vorhanden. In diesen Lücken sind u.a. offensichtlich Zeichen, die nicht im Suchmuster vertreten sein dürfen. Das Ersetzen des rechten Intervallgrenzen 'bf' durch 'c0' führt zu einer Fehlermeldung von sed.
Dadurch wird es erforderlich, für jeden Block eigene Intervallgrenzen anzugeben. Ggf. kommen auch noch einzelne Zeichen dazu.
Ich weiß nicht, wie es bei sed ist, aber im vi ist es so, dass eine Character Range nicht größer als 256 Zeichen sein kann. Ich denke, es ist im sed genau so und daher rühren diese Fehlermeldungen.
regards, Christian
Hmm, das wäre eine Erklärung - dann müßtest Du das halt in Bereiche aufteilen: [\\u0000-\\u00ff] [\\u0100-\\u01ff] [\\u0200-\\u02ff] [\\u0300-\\u036f] sollte dann funzen. Versuchs doch erstmal mit den ersten 256 Zeichen aus dem ersten Bereich, obs geht und was passiert... cu jth -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Am Mo, 30 Aug 2010 14:44:20 CEST schrieb Martin Blank: Hallo Martin, Vorbemerkung. Gerade sind die anderen Mails reingekommen. Ich schick das Mail ab, um zu zeigen, was ich herausgefunden habe.
Diese Zeichen sollen also erhalten bleiben: http://de.wikipedia.org/wiki/Unicode-Block_Griechisch_und_Koptisch U+0370 (880) - U+03FF (1023)
U+0000 (0) - U+036F (879) soll gelöscht werden. http://de.wikipedia.org/wiki/Liste_der_Unicode-Bl%C3%B6cke
Al
echo "SONDERZEICHEN (Άναψε)" | sed -e 's/[^\xce\x86-\xce\xbf]//g' Άναε
Es ist anscheinend grundsätzlich möglich, allerdings: Die Zeichen, die erhalten bleiben sollen, bilden keinen geschlossenen Block.
Komisch, echo "SONDERZEICHEN (φχψωϊ)" | sed -e 's/[^\xce\x86-\xce\xbf]//g' ϊ Die Zeichen sollten lt. Unicode-Liste in einem Block sein. echo "SONDERZEICHEN (Αα Ββ Γγ Δδ Εε Ζζ Ηη Θθ Ιι Κκ Λλ Μμ Νν Ξξ Οο Ππ Ρρ Σσ Ττ Υυ Φφ Χχ Ψψ Ωω)" | sed -e 's/[^\xce\x86-\xce\xbf]//g' (in 1 Zeile) ergibt αΒβΓγΔδΕεΖζΗηΘθΙιΚκΛλΜμΝνΞξΟοΠΡρΣΤΥΦΧΨΩ Es fehlt also: Α τ υ φ χ ψ ω Letztlich brauche ich nur eine Entscheidung, griechische Zeichen in einer Variable vorhanden, ja oder nein. Ich denke die Wahrscheinlichkeit ist sehr groß, dass es zur richtigen Entscheidung kommt Es sieht danach aus, dass das große griech. Αlfa noch gelöscht wird und ab dem kleinen τ wieder gelöscht wird. U+0391 Α 0xce 0x91 Α Α GREEK CAPITAL LETTER ALPHA U+03C4 τ 0xcf 0x84 τ τ GREEK SMALL LETTER TAU U+03C5 υ 0xcf 0x85 υ υ GREEK SMALL LETTER UPSILON U+03C6 φ 0xcf 0x86 φ φ GREEK SMALL LETTER PHI U+03C7 χ 0xcf 0x87 χ χ GREEK SMALL LETTER CHI U+03C8 ψ 0xcf 0x88 ψ ψ GREEK SMALL LETTER PSI U+03C9 ω 0xcf 0x89 ω ω GREEK SMALL LETTER OMEGA echo "SONDERZEICHEN (ϊϋόύώϏϐϑϒϓϔϕϖϗ)" | sed -e 's/[^\xce\x86-\xce\xbf]//g' ϊϐϑϒϓϔ Ist das ein Bug in sed? Al -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hallo, Am Mon, 30 Aug 2010, Al Bogner schrieb:
Es geht darum, dass ?????????? übrigbleibt, es sollen also nur griechische Zeichen übrig bleiben, _alle_ anderen, und nicht nur ein bestimmtes Zeichen, sollen gelöscht werden.
Diese Zeichen sollen also erhalten bleiben: http://de.wikipedia.org/wiki/Unicode-Block_Griechisch_und_Koptisch U+0370 (880) - U+03FF (1023)
Dann mach das auch (wenn du rausgefunden hast, wie man die UTF-Sachen an sed verfüttert. Um mal bei der \Uxxxx Version zu bleiben: sed 's/[^\U370-\U03FF]//g' Testen kannst du auch noch: perl -ne 'use Encode; $_ = decode("ut8", $_); s/[^\x{0370}-\x{03FF}]//g; print encode("utf8",$_);' Soweit ich das hier testen kann sollte das klappen ;) $ echo 'äöü µ' | recode latin9..utf8 | perl -ne 'use Encode; $_=decode("8", $_);s/[\x{00F5}-\x{00FF}]//g; print encode("utf8",$_);' | recode utf8..latin9 ä µ $ :) HTH, -dnh -- In the beginning the Universe was created. This has made a lot of people very angry and been widely regarded as a bad move. -- THHGTTG, Douglas Adams -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Am Mon, 30 Aug 2010, David Haller schrieb: [..] C&P Fehler:
perl -ne 'use Encode; $_ = decode("ut8", $_); $_ = decode("utf8", $_);
s/[^\x{0370}-\x{03FF}]//g; print encode("utf8",$_);'
Soweit ich das hier testen kann sollte das klappen ;)
$ echo 'äöü µ' | recode latin9..utf8 | perl -ne 'use Encode; $_=decode("8", $_);s/[\x{00F5}-\x{00FF}]//g; print $_=decode("utf8", $_);
-dnh -- Ich bin zu hübsch für Papierkram! -- Dr. House -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Am Mo, 30 Aug 2010 15:50:41 CEST schrieb David Haller:
Am Mon, 30 Aug 2010, David Haller schrieb: [..]
C&P Fehler:
perl -ne 'use Encode; $_ = decode("ut8", $_); $_ = decode("utf8", $_);
s/[^\x{0370}-\x{03FF}]//g; print encode("utf8",$_);'
Soweit ich das hier testen kann sollte das klappen ;)
$ echo 'äöü µ' | recode latin9..utf8 | perl -ne 'use Encode; $_=decode("8", $_);s/[\x{00F5}-\x{00FF}]//g; print $_=decode("utf8", $_);
Hallo David, Wenn ich ein recode oder iconv mit tr verwende, dann ist das sicher ein Lösungsansatz, aber der kommt mir vor als ob man mit Kanonen auf Spatzen schießt. Wie schon geschrieben, es geht nur darum, kommen _irgendwelche_ griechischen Zeichen in einer Variable vor oder nicht. Al -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hallo, Am Mon, 30 Aug 2010, Al Bogner schrieb:
Am Mo, 30 Aug 2010 15:50:41 CEST schrieb David Haller:
Am Mon, 30 Aug 2010, David Haller schrieb: [..]
C&P Fehler:
perl -ne 'use Encode; $_ = decode("ut8", $_); $_ = decode("utf8", $_);
s/[^\x{0370}-\x{03FF}]//g; print encode("utf8",$_);'
Soweit ich das hier testen kann sollte das klappen ;)
$ echo 'äöü µ' | recode latin9..utf8 | perl -ne 'use Encode; $_=decode("8", $_);s/[\x{00F5}-\x{00FF}]//g; print $_=decode("utf8", $_);
Wenn ich ein recode oder iconv mit tr verwende, dann ist das sicher ein Lösungsansatz, aber der kommt mir vor als ob man mit Kanonen auf Spatzen schießt. Wie schon geschrieben, es geht nur darum, kommen _irgendwelche_ griechischen Zeichen in einer Variable vor oder nicht.
Das recode ist nur, weil ich hier latin9 im xterm verwende und nicht utf8. Wenn du utf8 in der Variablen hast: echo "$SONDERZEICHEN" | perl -ne 'use Encode; $_ = decode("utf8", $_); s/[^\x{0370}-\x{03FF}]//g; print encode("utf8",$_);' Ausgabe ist _nur_ aus dem griechischen Unicode-Block U+0370 bis U+03FF. Ansonsten ist die Ausgabe leer. Äh, evtl. braucht's noch ne Sonderbehandlung für den Zeilenumbruch, und anderen Leerraum, den will man wohl aufheben. s/[^\x{0000}-\x{0020}\x{0370}-\x{03FF}]//g; Das hebt erstmal den Sonderzeichenblock bis zum Leerzeichen und dazu noch den gr. Block auf. HTH, -dnh -- Hey, what do you expect from a culture that *drives* on *parkways* and *parks* on *driveways*? -- Gallagher -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hallo, Am Mon, 30 Aug 2010, Al Bogner schrieb:
Wenn ich ein recode oder iconv mit tr verwende, dann ist das sicher ein Lösungsansatz, aber der kommt mir vor als ob man mit Kanonen auf Spatzen schießt. Wie schon geschrieben, es geht nur darum, kommen _irgendwelche_ griechischen Zeichen in einer Variable vor oder nicht.
Dafür reicht übrigens: if echo "$VAR" | perl -ne 'use Encode; $_ = decode("utf8", $_); if( /\x{0370}-\x{03FF}/ ) { exit(0); } exit(1);' then echo "'\$VAR' enthält griechisch"; else echo "'\$VAR' enthält kein griechisch"; fi Evtl. ginge das auch mit grep, da weiß ich aber nicht, wie man da Unicode angibt. Wenn du mit perl Scripten würdest wär's einfacher ;P HTH, -dnh --
Autobahnen. Du meinst sicherlich die Auffahrten auf die überlangen und unsinnigen Großparkplätze, richtig? -- Uwe Ohse zu Jens Link in dasr -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
participants (5)
-
Al Bogner
-
Christian Brabandt
-
David Haller
-
Joerg Thuemmler
-
Martin Blank