On 5/19/21 7:44 AM, Arno wrote:
On 18.05.21 17:02, tomas(a)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