On 5/19/21 7:44 AM, Arno wrote:
On 18.05.21 17:02, tomas@tuxteam.de wrote:
On Tue, May 18, 2021 at 04:46:08PM +0200, Lars Hennig wrote:
Am 18.05.21 um 16:25 schrieb Arno:
Hi, eigentlich wollte ich nur in einem File ... {0x123, 0x45 {0x123, 0x45 {0x123, 0x45
{0x100, 0x01
jeweils das Ende der Zeile mit }, abschließen.
Alle meine Versuche mit sed scheitern. Warum?
sed 's/$/},/' file.txt
müsste doch gehen oder nicht?
[...]
Hallo Arno,
ist das vielleicht ein File mit DOS Linebreaks? Bei mir geht sed -e 's/([0-9])\s*$/\1},/g' file.txt
Hi,
ich geb zu ich stehe mit regexp auf Kriegsfuß .. ich brauch es einfach zu selten um mir das zu merken.
Google jedesmal danach und dann findet man nur die Basics
Ich sehe die Erfinder immer vor mir wie sie wild ums Feuer tanzen und sich diebisch freuen endlich eine zwar logische aber unleserliche Syntax erschaffen zu haben die jeden nicht-Nerd in den Wahnsinn treibt.
Also das hilft so nicht ganz, weil eine Zeile auf mit a..f enden kann.
Kann mir die Zeile jemand erklären? Gibt es kein "*" das jeden Charakter beschreibt?
Genaugenommen bearbeite ich das file in 3 Schritten, weil es am Anfang die "{" braucht und 0x for die Zahlen und ein Komma dazwischen. Ich bin mir sicher man kann das auch mit einem noch unleserlichem Ausdruck hinbekommen ;)
Wieso versagt das so kläglich nur weil es im Windows-Format ist? Ich dachte schon an sowas, aber Zeilenende ist Zeilenende.
Das Dos2linux ist bei mir nicht drauf, das wäre wahrscheinlich der einfachere Weg. Aber ich war auch neugierig auf die Regexp.
Ach, dos2unix braucht man doch gar nicht.
uwe@taurus:~$ xxd arnosfile.txt 00000000: 7b30 7831 3233 2c20 3078 3435 0d0a 7b30 {0x123, 0x45..{0 00000010: 7831 3233 2c20 3078 3435 0d0a 7b30 7831 x123, 0x45..{0x1 00000020: 3233 2c20 3078 3435 0d0a 0d0a 7b30 7831 23, 0x45....{0x1 00000030: 3030 2c20 3078 300d 0a 00, 0x0..
uwe@taurus:~$ perl -p -i -e 's/\r//' arnosfile.txt
uwe@taurus:~$ xxd arnosfile.txt 00000000: 7b30 7831 3233 2c20 3078 3435 0a7b 3078 {0x123, 0x45.{0x 00000010: 3132 332c 2030 7834 350a 7b30 7831 3233 123, 0x45.{0x123 00000020: 2c20 3078 3435 0a0a 7b30 7831 3030 2c20 , 0x45..{0x100, 00000030: 3078 300a 0x0.
uwe@taurus:~$ sed 's/$/},/' arnosfile.txt {0x123, 0x45}, {0x123, 0x45}, {0x123, 0x45}, }, {0x100, 0x0},
Hätte man auch in einem Schritt machen können und sogar die leere Zeile leer lassen mit:
perl -p -i -e 's/\r//; s/$/},/ if /^{/'
Wenn ich es richtig verstehe, sah der ursprüngliche Input so aus:
$ cat arnosfile.txt 123 45 123 45 123 45
100 0
(mit \r\n-Zeilenenden), richtig? Das geht auch mit sed:
sed -re 's/([0-9a-f]+)\s([0-9a-f]+)\r/{\1, \2},/' arnosfile.txt
Wenn Du noch ein -i spendierst, wird es direkt in die Datei geschrieben.
Mit (..) erstellt man eine Gruppe, das \1 auf der rechten Seite wird dann durch die erste Gruppe ersetzt.
Liebe Grüße Uwe