Zeichen ersetzen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
RobertDebiannutzer
Beiträge: 385
Registriert: 16.06.2017 09:52:36

Re: Zeichen ersetzen

Beitrag von RobertDebiannutzer » 03.02.2019 17:35:27

Ich würde folgendes Vorgehen vorschlagen:

Code: Alles auswählen

$ echo '–' | hd
00000000  e2 80 93 0a                                       |....|
00000004
$ echo '–' | sed "s_\xe2\x80\x93_+_g"
+
Den Gedankenstrich habe ich in LibreOffice erzeugt und ins Terminal kopiert (urxvt). Du kannst auch den UTF-8-Code auf mehreren Websites im Internet nachschauen. Dort findest Du dann auch die (englischen) Namen für das entsprechede Zeichen (z.B. "EN DASH" in diesem Fall).
Umgekehrt kann z.B. printf auch aus Unicode-Codes Zeichen machen (s. manpage von printf).

EDIT: Ist mir noch eingefallen: Wahrscheinlich unterstützen nicht alle Varianten von sed hex-Zeichen. Ich nutze GNU sed aus stretch.
Bei meinem sed und meinem Terminal geht sogar:

Code: Alles auswählen

$ echo '–' | sed "s_–_+_g"
+

guennid

Re: Zeichen ersetzen

Beitrag von guennid » 03.02.2019 19:25:32

Das mit den Tastatureingaben, bzw copy+paste ist halt so'ne Sache, je nachdem wo du was eintippst. Giuckst du hier (1). Ich habe inzwischen vier solcher für mich kritischen Zeichen entdeckt und kann die auch via copy+paste mit sed händeln. eggys Schnipsel ist da schon was sehr Geeignetes. Aber schöner wäre halt, man könnte dem sed einen eindeutigen utf-8-code zum Ersetzen mitgeben statt das, was man da zu sehen glaubt, z.B. einen "Gedankenstrich", was immer der jeweilige Leser für einen solchen halten mag, hier also AltGr+-, bzw Strg+shift+2013, eingegeben im Terminal (übrigens das gleiche das du benutzt]. :wink:
Und da war eggys Syntax wohl nicht die zielführende. Aber Meillo interessiert''s vielleicht nicht. :wink:

(1) viewtopic.php?f=12&t=171239&hilit=utf+8

Benutzeravatar
RootRat
Beiträge: 29
Registriert: 03.06.2016 06:37:12

Re: Zeichen ersetzen

Beitrag von RootRat » 04.02.2019 04:04:12

Aber schöner wäre halt, man könnte dem sed einen eindeutigen utf-8-code zum Ersetzen mitgeben statt das, was man da zu sehen glaubt
Warum machst du das denn nicht?

Suche dir den Code fuer die Zeichen raus, beispielsweise von dieser Seite:
https://www.utf8-chartable.de/unicode-u ... pl?utf8=0x
und packe dir fuer jeden langen oder kurzen Bindestrich den Wert in eine
Variabel.
Mit sed kannst du diese dann zusammenfassen und mit nur einem Ersatzeichen
austauschen.
Einfacher geht es nicht.

Ein Beispiel, quick and dirty:

Code: Alles auswählen

#!/usr/bin/env bash

A=$(printf "\xE2\x96\x88")
B=$(printf "\xe2\x98\x8e")
C=$(printf "\xe2\xa8\x81")
D=$(printf "\x5e")
E=$(printf "\x22")
# usw.

echo $A $B $C $D $E                              # Zeige Variableninhalt

text="ab-█-⨁-☎-cd ^ef-█-g"                      # Testtext

sed "s/[$A$B$C]/*/g;s/\\$D/\\$E/g" <<<$text      # Zeichenersetzung

###  Ergebnis:  ab-*-*-*-cd "ef-*-g


# Erklaerung:

# s/[$A$B$C]/*/g => Suche (zusammengefasst) bestimmte Sonderzeichen und ersetze
# alle Vorkommen mit nur einem anderem Zeichen (hier mit Stern).

# s/\\$D/\\$E/g  => Suche Circumflex accent und ersetze mit Quotation mark.
# Quotation mark Variabel und aehnliche muessen gesondert escaped werden
# (Doppelter backslash).

# sed string muss in Quotation marks gesetzt werden, damit die Shell die
# Variabel(n) expandieren kann. 

eggy
Beiträge: 3331
Registriert: 10.05.2008 11:23:50

Re: Zeichen ersetzen

Beitrag von eggy » 04.02.2019 04:34:20

guennid hat geschrieben: ↑ zum Beitrag ↑
03.02.2019 19:25:32
eggys Schnipsel ist da schon was sehr Geeignetes. Aber schöner wäre halt, man könnte dem sed einen eindeutigen utf-8-code zum Ersetzen mitgeben statt das,
aus einem "meiner Schnipsel":
eggy hat geschrieben: ↑ zum Beitrag ↑
03.02.2019 14:18:47

Code: Alles auswählen

echo 1 | sed s_1_$'\u2013'_g; 
Was das \u2013 bedeutet, findet man übrigens da: https://en.wikipedia.org/wiki/List_of_U ... de_symbols

Benutzeravatar
Meillo
Moderator
Beiträge: 8813
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Zeichen ersetzen

Beitrag von Meillo » 04.02.2019 06:06:11

guennid hat geschrieben: ↑ zum Beitrag ↑
03.02.2019 19:25:32
Aber Meillo interessiert''s vielleicht nicht. :wink:
Den Meillo interessiert's gerade nicht, weil die technische Loesung schon vorliegt. ;-)
guennid hat geschrieben: ↑ zum Beitrag ↑
03.02.2019 19:25:32
einen "Gedankenstrich", was immer der jeweilige Leser für einen solchen halten mag
Das ist der Knackpunkt beim Verstaendnis. Dein Wunsch (``was immer der jeweilige Leser fuer einen solchen halben mag'') ist natuerlich unmoeglich, weil woher soll die Software wissen, was derjeweilige Leser fuer einen haelt? Was die Software am ehesten in diese Richtung bieten koennte, waeren Aequivalenzklassen in denen alle Gedankenstriche, die der jeweilige Sprachraum (!) fuer solche haelt, zusammengefasst werden, aber ob das in den Locales umgesetzt ist, weiss ich nicht (ich vermute eher, dass nicht). Folglich bleibt dir nur, selber genau aufzulisten, welche Unicode-Codepoints (Zeichen) du ersetzen willst und die mittels UTF-8-Escape anzugeben. Das haben die anderen schon vorgeschlagen ... darum kann ich mich hier gemuetlich zuruecklehnen und mitlesen. ;-)
Use ed once in a while!

eggy
Beiträge: 3331
Registriert: 10.05.2008 11:23:50

Re: Zeichen ersetzen

Beitrag von eggy » 04.02.2019 07:10:23

Meillo hat geschrieben: ↑ zum Beitrag ↑
04.02.2019 06:06:11
Was die Software am ehesten in diese Richtung bieten koennte, waeren Aequivalenzklassen in denen alle Gedankenstriche, die der jeweilige Sprachraum (!) fuer solche haelt, zusammengefasst werden, aber ob das in den Locales umgesetzt ist, weiss ich nicht (ich vermute eher, dass nicht).
Teilweise/Vielleicht kann man hier auf die Hilfe von uconv und co zurückgreifen, ich find die jedoch nicht wirklich intuitiv.

Daher lieber selbst die paar in Frage kommenden Zeichen rausfischen:

Code: Alles auswählen

sed 's_\(.\)_\1\n_g' datei.txt | grep -v "[a-z0-9A-Z,]" | sort -u
Das zerlegt die Datei erstmal Buchstabenweise, sammelt dann alle Zeilen raus die Buchstaben, Zahlen oder Komma enthalten, sortiert dann die übriggebliebenen Ergebnisse und gibt wegen -u davon jeweils nur eins aus (und ja, wahrscheinlich geht das schöner, z.B. indem man hier fürs Ersetzen nur sed nimmt - nur bekomm ich damit 'uniq' nicht so einfach hin ... na, Meillo?)

Alles was da übrigbleibt kann man dann in Ruhe in der Tabelle nachschlagen.

Oder es den Rechner machen lassen, ich bin dazu grad über Debianuni2ascii gestolpert, das hat nen paar interessante Optionen in der manpage, für den Fall hier scheint U passend:

Code: Alles auswählen

echo – | uni2ascii -a U -q
will man den uni2ascii Befehl direkt per Pipe an sed/sort anhängen, muss man wahrscheinlich auch noch bzgl. Encoding von Anführungszeichen und co aufpassen, daher hier alleinstehend, ging ja nur um nen paar Zeichen

guennid

Re: Zeichen ersetzen

Beitrag von guennid » 04.02.2019 19:25:10

Für mich ist das "technisch" nach wie vor nicht klar, denn das hier:

Code: Alles auswählen

sed "s_$'\u2013'_+_g; " test.txt
funktioniert nicht. In test.txt steht nichts außer:

Code: Alles auswählen

William C. „Billy“ Irvine sollen – und zwar
Die Behandlung der typografischen Anführungszeichen ist erledigt, darum geht's nicht (mehr). Das fragliche Zeichen, der "lange" Bindestrich wird nicht umgewandelt. Ich sehe im Moment nicht, dass ich in meinem Umsetzungsversuch irgendeine Anmerkung von eggy auf S.1 nicht beachtet hätte.

Und ich weiß nach wie vor nicht, ob es das an einem Syntaxfehler in eggys Vorschlag liegt, oder ob das von mir als "langer" Bindestrich genannte Zeichen eben nicht das von eggy vermutete utf-8-Zeichen ist.
Ersetze ich im sed Kommando eggys utf-8-Konstrukt ($'\u2013') via Tastatureingabe: AltGr+- dann wird das Zeichen umgewandelt.

Same procedure mit

Code: Alles auswählen

$ echo 'William C. „Billy“ Irvine sollen – und zwar' | sed "s_$'\u2013'_+_g; "
Zuletzt geändert von guennid am 04.02.2019 19:41:31, insgesamt 1-mal geändert.

Benutzeravatar
Meillo
Moderator
Beiträge: 8813
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Zeichen ersetzen

Beitrag von Meillo » 04.02.2019 19:41:14

guennid hat geschrieben: ↑ zum Beitrag ↑
04.02.2019 19:25:10
Für mich ist das "technisch" nach wie vor nicht klar, denn das hier:

Code: Alles auswählen

sed "s_$'\u2013'_+_g; " test.txt
funktioniert nicht.
Das kann auch nicht funktionieren. Es ist auch nicht das was eggy vorgeschlagen hat. ;-) Du musst genau (!) hinschauen! (Tipp: Quoting)
Use ed once in a while!

eggy
Beiträge: 3331
Registriert: 10.05.2008 11:23:50

Re: Zeichen ersetzen

Beitrag von eggy » 04.02.2019 19:42:00

Versuchs mal ohne die ". Hier müssen die ausnahmsweise mal weg, weil $'\u...' ja durch die Shell ersetzt werden soll.

Code: Alles auswählen

echo 'William C. „Billy“ Irvine sollen – und zwar' | sed s_$'\u2013'_+_g

guennid

Re: Zeichen ersetzen

Beitrag von guennid » 04.02.2019 19:45:43

ad Meillo
Und du solltest weniger selektiv lesen. :wink:

Bingo, Herr eggy!!! :THX: :mrgreen: :|

Benutzeravatar
Meillo
Moderator
Beiträge: 8813
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Zeichen ersetzen

Beitrag von Meillo » 04.02.2019 19:50:09

guennid hat geschrieben: ↑ zum Beitrag ↑
04.02.2019 19:45:43
ad Meillo
Und du solltest weniger selektiv lesen. :wink:
Du solltest genauer lesen. ;-)


@eggy: Ich haette ihn noch ein bisschen zappeln lassen, weil was man selber lernt, lernt man besser.
Use ed once in a while!

guennid

Re: Zeichen ersetzen

Beitrag von guennid » 04.02.2019 19:52:22

Meillo, ich empfinde das als ziemlich unverschämt. Vielleicht kannst du's ohne selektives Lesen nachvollziehen. Aber dann müsstest du den ja nicht allzu langen Thread ziemlich "genau" nachlesen

eggy
Beiträge: 3331
Registriert: 10.05.2008 11:23:50

Re: Zeichen ersetzen

Beitrag von eggy » 04.02.2019 19:55:31

@Meillo: dann müsst ich mir ja ne Notiz machen, später nochmal in den Thread zu schauen, viel zu kompliziert

@guennid: nimm Dir mal etwas Zeit Dich mit Shellquoting zu befassen, das Problem der unterschiedlichen Anführungszeichen (und von denen gibts mindestens so viele verschiedene wie Minus/Binde/Gedanken/wasauchimmer-Striche) wird Dir noch öffters übern Weg laufen

guennid

Re: Zeichen ersetzen

Beitrag von guennid » 04.02.2019 20:01:42

@guennid: nimm Dir mal etwas Zeit Dich mit Shellquoting zu befassen,
Ich bin kein Fachmann und ich will auch keiner mehr werden.
das Problem der unterschiedlichen Anführungszeichen (und von denen gibts mindestens so viele verschiedene wie Minus/Binde/Gedanken/wasauchimmer-Striche) wird Dir noch öffters übern Weg laufen
Soviel ist mir nach 17 Jahren df auch klar geworden, und deswegen hatte ich konkret nachgefragt, ob die Anführungszeichen obligatorisch sind. Dass du's an der Strlle nicht bemerkt hast, nehm ich dir nicht übel. Sowas passiert nun mal.

OT: Ich rufe das sed von einem DOS-Programm aus auf. Ich habe es bisher nicht geschafft, das Kommando komplett in ein shell-script zu kriegen mit

Code: Alles auswählen

#!/bin/sh
. Ist auch nicht unbedingt erforderlich, wäre mir aber lieber.

eggy
Beiträge: 3331
Registriert: 10.05.2008 11:23:50

Re: Zeichen ersetzen

Beitrag von eggy » 04.02.2019 21:00:31

Das hat nichts mit "Fachmann sein" zu tun, um nen Hammer am richtigen Ende festzuhalten, muss man ja auch kein Handwerker sein.

Benutzeravatar
Meillo
Moderator
Beiträge: 8813
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Zeichen ersetzen

Beitrag von Meillo » 04.02.2019 21:06:34

@guennid:

Mir faellt es eher schwer, wenn jemand zeigt und aeussert, dass er gar nicht verstehen will, sondern nur eine Loesung braucht, und gleichzeitig erwartet, dass andere Zeit und Energie rein investieren, zu helfen. Das faellt mir besonders darum schwer, weil all mein Bestreben, in diesem Forum ist, selber zu lernen und anderen beim Lernen zu helfen. Wenn jemand sagt, dass er nicht lernen will -- was legitim ist -- dann ist das fuer mich recht wenig interessant. Darum trage ich dann nur bei, wenn fuer mich dabei was rausspringt oder es kaum Aufwand fuer mich bedeutet.

Ich haette mir gewuenscht, dass du genauer hingeschaut und mehr ausprobiert haettest, statt nur zu sagen, dass eggys Vorschlag nicht funktionieren wuerde. Mir war es wichtig, dass du selber erkennst, warum es bei dir nicht funktioniert. Falls du hier oder an anderer Stelle schonmal gesagt hast, dass du es gar nicht lernen willst, dann will ich mich entschuldigen, dass ich das uebersehen oder vergessen habe. Ich wollte dich nicht absichtlich damit aergern; es war mir nicht bewusst.

Wahrscheinlich haette ich mich sowieso weiter aus dem Thread rausgehalten, wenn nicht mein Name gleich zweimal gefallen waere. Ich bin damit ja geradezu eingeladen worden. Es waere nicht noetig gewesen, eggy hatte und hat das thematisch hier super im Griff.

Sorry for the noise ... :roll:
Use ed once in a while!

eggy
Beiträge: 3331
Registriert: 10.05.2008 11:23:50

Re: Zeichen ersetzen

Beitrag von eggy » 04.02.2019 21:11:58

@Meillo: ich hab Dich erwähnt, weil ich Deine Lösungen meist wesentlich eleganter finde - ich mach das hier ja auch nur weil ich noch was lernen will :mrgreen:

Antworten