okascha
Anmeldungsdatum: 25. April 2012
Beiträge: 107
Wohnort: Berlin
|
Hallo, Ich möchte mit expr index "$string" c nach dem ersten "c" im String suchen. $string enthält in meinem Fall aber Umlaute und expr zählt offensichtlich Bytes... Ich kann also nichts mit expr anfangen. Probeweise habe ich mal locale eingetippt und LANGUAGE=de_DE:en gefunden. Ich dachte, das 'en' am Schluss könnte der Grund sein. Aber eine einfaches Überschreiben der Variable auf de_DE:de hat nichts gebracht. Kann mir da jemand weiterhelfen?
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17552
Wohnort: Berlin
|
| > string="abcde"
> expr index "$string" c
3
|
Ist String bei Dir nicht richtig geschrieben (klein/groß) oder hast Du bei der Zuweisung blanks um das Gleichheitszeichen benutzt? Was ergibt echo $string?
|
okascha
(Themenstarter)
Anmeldungsdatum: 25. April 2012
Beiträge: 107
Wohnort: Berlin
|
Hier ein Output von meiner Bash-Shell. Ich habe es selbst nochmal getestet. Der Fehler zeigt sich auch ohne Variablennutzung: > expr index "abcäxy" c
3
> expr index "abcäxy" ä
4
> expr index "abcäxy" x
6 'ä' kann er noch, das 'x' ist aber plötzlich als 6. Zeichen angegeben, anstatt als 5.. Ist das normal oder ist in meinem System irgend was faul? Ich habe übrigens auch das merkwürdige Phänomen, dass Gimp und LibreOffice plötzlich mit englischen Menüdialogen daherkommen.
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17552
Wohnort: Berlin
|
Ja, die Anführungsstriche sind auch überflüssig. Als Zeichen gelten wohl die lower-Ascii-Zeichen. Dt. Umlaute werden als 2 Zeichen kodiert. In der Dokumentation ist das nicht klar darstellt.
|
okascha
(Themenstarter)
Anmeldungsdatum: 25. April 2012
Beiträge: 107
Wohnort: Berlin
|
Das ist also normal? Du hast den gleichen Output? Ich bin langsam etwas entnervt, was meine Ambitionen zur String-, Zeichen und Dateimanipulation angeht. Mit sed lässt sich selbst eine einfache Aufgabe wie html-Kommentare aus einer Datei zu entfernen nicht lösen. Also dachte ich, ich mache es in der Bash "per Hand" aber lasse mir von expr index helfen, doch Fehlanzeige. Ich muss wohl awk oder Perl lernen? Das Sed-Problem ist übrigens, dass die Regex immer "greedy" sind (wie auch bei expr match). Selbst bei einer einzigen Zeile tritt also das Problem auf, dass so etwas wie <!–.*–> bei
<!-- K1 --> Text <!-- K2 -->
den Text mit verschluckt.
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17552
Wohnort: Berlin
|
| echo '<!-- K1 --> Text <!-- K2 -->' | sed 's/<!--[^>]*>/##getilgt##/g'
|
|
okascha
(Themenstarter)
Anmeldungsdatum: 25. April 2012
Beiträge: 107
Wohnort: Berlin
|
das funktioniert aber nur solange die Kommentartags nicht zufällig auch auskommentierte HTML-Tags enthalten (oder wenn aus irgend einem anderen Grund das Zeichen '>' vorkommt) ... daher reicht mir der Ansatz mit [^>]* nicht.
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17552
Wohnort: Berlin
|
okascha schrieb: das funktioniert aber nur solange die Kommentartags nicht zufällig auch auskommentierte HTML-Tags enthalten (oder wenn aus irgend einem anderen Grund das Zeichen '>' vorkommt) ... daher reicht mir der Ansatz mit [^>]* nicht.
Wenn Du mit Sed an die Sache rangehst und nicht dazusagst, dass Du sowas berücksichtigen willst, und als Beispiel nur | <!-- K1 --> Text <!-- K2 -->
|
bringst, darfst Du Dich nicht wundern. Wenn Du Syntax erkennen musst - dafür gibt es Tools die das können, etwa xmlstarlet.
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
Offensichtlich ist expr für deinen Zweck einfach das falsche Tool, weil es stumpf die Bytes zählt: track@lucid:~$ expr length "abc"
3
track@lucid:~$ expr length "äöü"
6 Und da gibt es bei utf-8 eben auch etliche mehr-Byte-Zeichen. Beschreib uns doch mal Deine genaue Problemstellung, dann können wir Dir bestimmt etwas passenderes vorschlagen ! okascha schrieb: Das Sed-Problem ist übrigens, dass ... den Text mit verschluckt.
Nicht unbedingt: track@lucid:~$ echo '<!-- K1 --> Text <!-- K2 -->' | sed 's/<[^>]*>/#/g'
# Text # LG, track
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17552
Wohnort: Berlin
|
track schrieb:
okascha schrieb: Das Sed-Problem ist übrigens, dass ... den Text mit verschluckt.
Nicht unbedingt: track@lucid:~$ echo '<!-- K1 --> Text <!-- K2 -->' | sed 's/<[^>]*>/#/g'
# Text #
Soweit waren wir schon. Sieh meinen vorletzten Beitrag und was darauf folgte.
|
okascha
(Themenstarter)
Anmeldungsdatum: 25. April 2012
Beiträge: 107
Wohnort: Berlin
|
Prinzipiell geht es mir darum, irgendwann einmal (in ferner Zukunft ☺ ) etwas souveräner Informationen aus großen Textdateien filtern und manipulieren zu können. Ob xml, html, php, odt (LibreOffice), Logfiles... was auch immer. Im Moment bin ich in dem Stadium, dass ich schaue, was die Bash alles kann, und was das ein oder andere Tool so alles kann. Allerdings bevorzuge ich da prinzipiell Lösungen, die auf Tools zurückgreifen, die in Ubuntu standardmäßig schon installiert sind (ist andererseits aber auch kein so großes Dogma). Deswegen versuchte ich es mit sed und expr. Letzteres hat mir jetzt verkackt. 😉 Jetzt mal ehrlich: Utf-8 nicht beherrschen ist doch inakzeptabel, und die RegEx-Funktion expr match setzt automatisch ein '^' an den Anfang des RegEx. Den greed-Faktor kann man (wie bei sed) auch nicht einstellen, und überhaupt traue ich dem Tool nicht mehr über den Weg (ich habe nicht mehr die Lust zu testen, ob die RegEx-Funktion Umlaute trotzdem sicher erkennt...). Was sed und meine Beispielaufgabe "HTML-Kommentare entfernen (in einer Zeile)" angeht, habe ich übrigens eine Lösung gefunden:
| echo "<!-- K1 --> <tag> Text </tag> <!-- K2 -->" | sed '
:here
s/\(.*\)<!--.*-->/\1/
there
'
|
Das verträgt auch die Tags mit '<' und '>' zwischen den Kommentaren. Offensichtlich scheint - das ist so meine Schlussfolgerung - der greed-Faktor bei zwei '.*' in einem Ausdruck zugunsten des ersten '.*' entschieden zu werden, weswegen zuerst K2 entfernt wird und dann K1. K2 überhaupt als einzelner Kommentar erfasst wird.
hat übrigens nicht geklappt.
|
okascha
(Themenstarter)
Anmeldungsdatum: 25. April 2012
Beiträge: 107
Wohnort: Berlin
|
Ich habe ein falschen Teststring gewählt. Besser ist: | echo "<!-- K1 --> Text <!-- K2 <tag> Text </tag> -->" | sed ...
|
Es ging mir ja um evtl. auskommentierte html-Tags innerhalb von Kommentaren...
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17552
Wohnort: Berlin
|
okascha schrieb:
Deswegen versuchte ich es mit sed und expr. Letzteres hat mir jetzt verkackt. 😉 Jetzt mal ehrlich: Utf-8 nicht beherrschen ist doch inakzeptabel,
Die Frage ist noch, wer von Euch beiden kein UTF-8 beherrscht. ☺
|
okascha
(Themenstarter)
Anmeldungsdatum: 25. April 2012
Beiträge: 107
Wohnort: Berlin
|
Der Fehler liegt bei mir? Na dann klär mich doch auf. Ich gehe davon aus, dass expr index sich auf Strings bezieht, und dass ich mich mit der Bash und Linux in einer utf-8-Umgebung befinde. Welchen Sinn macht es hier, sich mit dem Index nicht auf die Zeichenposition zu beziehen, sondern auf die Bytes? Auf der anderen Seite arbeitet die Bash doch auch zeichenorientiert, wenn sie Ausdrücke wie ${string:offset:length} anbietet. Wenn ich mit Strings operiere, will ich mich nicht mit Bytes rumschlagen. It's not a bug, it's a feature? Muss ich da ne ganz andere Perspektive einnehmen?
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17552
Wohnort: Berlin
|
okascha schrieb:
Auf der anderen Seite arbeitet die Bash doch auch zeichenorientiert, wenn sie Ausdrücke wie ${string:offset:length} anbietet. Wenn ich mit Strings operiere, will ich mich nicht mit Bytes rumschlagen.
Gut - wenn da mit Zeichenpositionen operiert wird, dann ist es inkonsistent.
|