wanne hat geschrieben: 12.10.2018 16:02:57
Defakto sind es sogar (mindestens) vier [ als bash Ersatz für GNU-test. [ als alias für /usr/bin/test, [ ] als regex in einem Vergleich und [] als argument an einem beliebigen Befehl, das durch Dateinamen ersetzt wird. Ein Graus.
Ich dachte bisher, dass es die Builtins [ , das auch den Namen test hat, und [[ gäbe, und dass es noch ein Programm Programm /usr/bin/\[ gäbe, das es auch unter dem Namen /usr/bin/test gäbe.
Nun stelle ich fest, dass /usr/bin\[ und /usr/bin/test zwei verschiedene Programme sind.
Ich habe in meinen alias weder [ noch test.
wanne hat geschrieben: 12.10.2018 16:02:57
Lohengrin hat geschrieben: 12.10.2018 14:57:09
Ich werden den Kram wohl in C schreiben.
Es fing damit an, dass ich aus verschiedenen Dateien automatisiert eine HTML-Seite bauen wollte, die ich mir dann mit einem Webbrowser ansehen kann. Das geht sehr gut mit Bash.
Nun will ich aber die Ursprung-Dateien dafür selber zusammenbauen, nämlich aufgrund von Infos die in Dateien liegen, worin nur Zeilen mit 40 Hexziffern langen Stücken, :-getrennt liegen, und in einem Fall auch eine Zeile, die aus base64 besteht.
Dann würde ich sogar auf keinen Fall zu C greifen. Bzw. nur mit passende HTML-libs.
Das HTML-Ding zusammenbauen ist nur ein Aneinanderhängen von Teilen, die ich vorbereitet da liegen habe.
Es geht darum, zu verwalten, was wie wann zusammengesetzt wird. Ich will mit Dateien, worin diese 40-hex vorkommen, festlegen, welche Teile für das Zusammensetzen benutzt werden.
wanne hat geschrieben: 12.10.2018 16:02:57
Lohengrin hat geschrieben: 12.10.2018 14:57:09
Es geht um genau eine Zeile, in der korrektes base64 liegen soll.
base64 -d würde bei \x0a nicht meckern, aber ich will ja, dass dann gemeckert wird.
Auch hier sehe ich das wieder anders. Nicht base64 -d verhält sich falsch. sondern dein nachfolgender Code, der nicht mit base64 umgehen kann sondern nur mit welchem, dass keine Zeilenumbrüche hat.
Das soll auch gar nicht mit jedem base64 umgehen können.
Ich habe zB Dateien, in denen genau zwei Zeilen sind. Die erste soll aus :-getrennten Stücken zu jeweils genau 40 Hexziffern mit kleinen abcdef bestehen. Und die zweite Zeile soll aus base64 bestehen. Wenn etwas anderes drin steht, soll die Datei verworfen werden.
wanne hat geschrieben: 12.10.2018 16:02:57
Ganz grundsätzliches anliegen: Wenn du irgend wie Daten manipulierst, dann auf der Ebene, auf der das Sinn macht und nicht irgend wie 5 schichten drunter.
Es sind ja nicht irgendwelche Daten. Es sind Daten, die in dem von mir gewünschten Format vorliegen müssen.
Da will ich zB dass der Benutzer den möglichen Namen für etwas als Parameter übergibt, und der mögliche Name besteht bei mir aus 40 Hexziffern mit kleinen abcdef. Wenn ich Pech habe, gibt der Benutzer einen Namen ein, wo ein ä vorkommt. Es hat mich überrascht, dass ich das nicht einfach mit [[ $line =~ ^[0-9a-f]{40}$ ]] prüfen kann.
wanne hat geschrieben: 12.10.2018 16:02:57
(Wie du schon zurecht beim ä bemerkt hast (das btw. wenn überhaupt u\xcc\x88 und nicht u\xcc\x88 encodiert wird. Aber die kanonische Form ist \xc3\xbc.)
M\xc3\xbcller und Mu\xcc\x88ller sind zwei verschiedene Namen. Ich will die nicht in einen Topf werfen. Das kann später geschehen, nämlich da, wo auch Stephan und Stefan zusammengefasst werden kann.
wanne hat geschrieben: 12.10.2018 16:02:57
Spätestens bei der nächsten Änderung der Encodierung auf das Layer drunter haut es dich halt auf die Fresse.
Ich habe Daten von Identitäten, die ihre Daten unterschrieben haben. Wenn da das Encoding wechselt, sind die Daten ungültig.
Die Identitäten haben bei mir eine Folge aus genau 40 Hexziffern mit kleinen abcdef als Namen. Und alles, was ich von den Daten der Identitäten auswerte, besteht nur aus Hexziffern mit kleinen abcdef oder base64 ohne \x0a.
Was das entpackte base64 für ein Encoding hat, ist nicht mein Problem.
wanne hat geschrieben: 12.10.2018 16:02:57
Nicht das Problem ist nicht, dass sich irgend wo das Encoding ändert das Problem ist, dass du an stellen wo du hex meinst [0-9a-f] schreibst.
Ich meine aber nicht hex. Ich meine [0123456789abcdef]. Bei mir heißen viele Dateien wie ihr Digest, und ich benutze ein Dateisystem, das zwischen A und a unterscheidet.
wanne hat geschrieben: 12.10.2018 16:02:57
Oder dass du wo du Zeichen zählen willst Bytes zählst, und dich dann über das 2Byte ü wunderst usw.
Ich habe mich nicht darüber gewundert, dass ü zwei Byte lang ist. Ich habe mich darüber gewundert, dass bei
${#foo} Zeichen gezählt werden und nicht Bytes. Für mich enthält eine Variable alles Mögliche außer \x00, so wie in C der Inhalt von char* .
Ich bin gar nicht auf die Idee gekommen, dass da jemand Zeichen statt Bytes zählen könnte, hätte, wenn ich nach deutschen Selbstlauten suche, die Regex als [aeiou(ä)(ö)(ü)] geschrieben.