Dateiinhalt automatisiert veraendern (\n entfernen)

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Benutzeravatar
hikaru
Beiträge: 9983
Registriert: 09.04.2008 12:48:59

Re: Dateiinhalt automatisiert veraendern (\n entfernen)

Beitrag von hikaru » 13.02.2018 15:15:08

Meillo hat geschrieben: ↑ zum Beitrag ↑
13.02.2018 14:32:53
hikaru hat geschrieben: ↑ zum Beitrag ↑
13.02.2018 14:23:02
Auf jeden Fall eleganter als mein md5-spezifischer Holzhammer:

Code: Alles auswählen

dd if=/dev/zero of=file.md5 bs=32 seek=1
... der endlos rennt und eine sehr grosse Zieldatei erzeugt. ;-)
Argh!
Sowas passiert, wenn man Sachen auf einem Rechner testet und dann zum Posten auf einem anderen abtippt. Ich meinte /dev/null, aber weil mir die Terminierung früher in anderen Situationen oft auf die Füße fiel, ist /dev/zero bei mir schon "muscle memory"*.
Nun ja, nehmen wir's auf in die Liste der Beispiele, warum man nicht ungeprüft copy&paste aus dem Netz machen sollte. ;)

Die korrigierte Variante mit /dev/null ist binär identisch (md5sum) zu unames truncate-Variante und meiner tr-sed-Kette.


*) Gibt's das auch auf Deutsch?

breakthewall
Beiträge: 507
Registriert: 30.12.2016 23:48:51

Re: Dateiinhalt automatisiert veraendern (\n entfernen)

Beitrag von breakthewall » 13.02.2018 15:18:30

Laut Manpage hat sed doch einen Binärmodus:
'-b'
'--binary'
This option is available on every platform, but is only effective where the operating system makes a distinction between text files and binary files. When such a distinction is made--as is the case for MS-DOS, Windows, Cygwin--text files are composed of lines separated by a carriage return _and_ a line feed character, and 'sed' does not see the ending CR. When this option is specified, 'sed' will open input files in binary mode, thus not requesting this special processing and considering lines to end at a line feed.

uname
Beiträge: 9536
Registriert: 03.06.2008 09:33:02

Re: Dateiinhalt automatisiert veraendern (\n entfernen)

Beitrag von uname » 13.02.2018 16:26:07

Mein SuSE kennt die Option -b von sed nicht.

breakthewall
Beiträge: 507
Registriert: 30.12.2016 23:48:51

Re: Dateiinhalt automatisiert veraendern (\n entfernen)

Beitrag von breakthewall » 13.02.2018 16:46:32

uname hat geschrieben: ↑ zum Beitrag ↑
13.02.2018 16:26:07
Mein SuSE kennt die Option -b von sed nicht.
Eine Linux-Distribution die GNU/sed nicht nutzt? Sehr ungewöhnlich.

uname
Beiträge: 9536
Registriert: 03.06.2008 09:33:02

Re: Dateiinhalt automatisiert veraendern (\n entfernen)

Beitrag von uname » 13.02.2018 16:52:47

https://www.unix.com/man-page/suse/1/sed/

Sollte vielleicht mal langsam auf Debian GNU/Linux wechseln.

Benutzeravatar
hikaru
Beiträge: 9983
Registriert: 09.04.2008 12:48:59

Re: Dateiinhalt automatisiert veraendern (\n entfernen)

Beitrag von hikaru » 13.02.2018 17:08:55

breakthewall hat geschrieben: ↑ zum Beitrag ↑
13.02.2018 15:18:30
Laut Manpage hat sed doch einen Binärmodus:
Fragt sich, welches sed du da vor dir hast. GNU sed kennt auch in Version 4.4.2 (Sid) kein --binary.

owl102
Beiträge: 2380
Registriert: 16.10.2010 13:05:57
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Timbuktu

Re: Dateiinhalt automatisiert veraendern (\n entfernen)

Beitrag von owl102 » 13.02.2018 17:15:01

Meillo hat geschrieben: ↑ zum Beitrag ↑
13.02.2018 14:24:17
Wieso? Wenn man die csh ausklammert, dann geht es portabel in allen POSIX-kompatiblen (Bourne-)Shells so:

Code: Alles auswählen

x="`<file.md5 tr -d \\n`"; printf %s "$x" >file.md5
Alle POSIX-kompatiblen Shells sollten aber $(..) können. Somit sollte folgendes POSIX-kompatibel sein:

Code: Alles auswählen

x="$(<file.md5 tr -d \\n)"; printf %s "$x" >file.md5
Siehe auch: http://mywiki.wooledge.org/BashFAQ/082
Fedora 29 Workstation -- Debian 9 (Qnap TS-109/119) -- OmniOS (HP N54L)

breakthewall
Beiträge: 507
Registriert: 30.12.2016 23:48:51

Re: Dateiinhalt automatisiert veraendern (\n entfernen)

Beitrag von breakthewall » 13.02.2018 17:24:09

hikaru hat geschrieben: ↑ zum Beitrag ↑
13.02.2018 17:08:55
Fragt sich, welches sed du da vor dir hast. GNU sed kennt auch in Version 4.4.2 (Sid) kein --binary.
Und was ist dann das: https://www.gnu.org/software/sed/manual/sed.txt ?

Dort steht das so drin. ^^

Benutzeravatar
ThorstenS
Beiträge: 2798
Registriert: 24.04.2004 15:33:31

Re: Dateiinhalt automatisiert veraendern (\n entfernen)

Beitrag von ThorstenS » 13.02.2018 17:53:22

Das sed in debian kennt seit Version 4.1 -i/--in-place. Das kam mit dem Wechsel von woody (sed 3.02) auf sarge (sed 4.1) und war ein echter Segen.

Ich habe davor auch Dateien mit awk eingelesen und im END Bereich dann wieder in die ursprüngliche Datei gepiped.
Das waren aber alles Krücken, sed -i rockt! :lol:

Edit:
Ein interessanter Bookmark zu der Thematik: http://richmegginson.livejournal.com/18726.html

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

Re: Dateiinhalt automatisiert veraendern (\n entfernen)

Beitrag von Meillo » 13.02.2018 18:25:57

breakthewall hat geschrieben: ↑ zum Beitrag ↑
13.02.2018 15:18:30
Laut Manpage hat sed doch einen Binärmodus:
'-b'
'--binary'
This option is available on every platform, but is only effective where the operating system makes a distinction between text files and binary files. When such a distinction is made--as is the case for MS-DOS, Windows, Cygwin--text files are composed of lines separated by a carriage return _and_ a line feed character, and 'sed' does not see the ending CR. When this option is specified, 'sed' will open input files in binary mode, thus not requesting this special processing and considering lines to end at a line feed.
Das ist inhaltlich etwas anderes als das was ich meine. Ist ja auch beschrieben, was genau dieses -b macht. Auf Unix ist es ein NOP. Es sorgt lediglich dafuer, dass bei fopen(3) beim zweiten Parameter ein `b' ergaenzt wird. Siehe Manpage von fopen(3) fuer Details. Damit kann man immer noch nicht s/\n// machen, weil man in sed(1) das Newline am Zeilenende nicht matchen kann. In einem Binaer-sed (so wie ich es beschrieben habe) koennte man das. Das ist wie im vi, da kann man auch nicht das Newline am Zeilenende einfach wegeditieren wie man alle anderen Zeichen der Zeile editieren kann. Es braucht dafuer den speziellen Befehl j. Das liegt daran, dass vi eben ein Text-Editor ist. So ist sed auch ein Programm zur Verarbeitung von Text-Files.
Use ed(1) once in a while!

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

Re: Dateiinhalt automatisiert veraendern (\n entfernen)

Beitrag von Meillo » 13.02.2018 18:29:21

owl102 hat geschrieben: ↑ zum Beitrag ↑
13.02.2018 17:15:01
Meillo hat geschrieben: ↑ zum Beitrag ↑
13.02.2018 14:24:17
Wieso? Wenn man die csh ausklammert, dann geht es portabel in allen POSIX-kompatiblen (Bourne-)Shells so:

Code: Alles auswählen

x="`<file.md5 tr -d \\n`"; printf %s "$x" >file.md5
Alle POSIX-kompatiblen Shells sollten aber $(..) können. Somit sollte folgendes POSIX-kompatibel sein:

Code: Alles auswählen

x="$(<file.md5 tr -d \\n)"; printf %s "$x" >file.md5
Ja. $() ist ebenso Teil von POSIX wie ``. Ich haette das nicht aendern muessen.

`echo -n' dagegen ist unportabel.
Use ed(1) once in a while!

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

Re: Dateiinhalt automatisiert veraendern (\n entfernen)

Beitrag von Meillo » 13.02.2018 18:37:47

hikaru hat geschrieben: ↑ zum Beitrag ↑
13.02.2018 15:15:08
Die korrigierte Variante mit /dev/null
Jetzt passt's. Coole Loesung und voll POSIX-konform! :-)

Aus meiner Sicht ist das die bisher beste Loesung (unter denen, die nur POSIX benoetigen), weil's nur genau ein Befehl ist und keine Hilfsdateien noetig sind.

Um /dev/null auch noch los zu werden und um den Befehl noch cooler und kuerzer zu machen:

Code: Alles auswählen

:|dd of=file.md5 bs=32 seek=1
:-D
Use ed(1) once in a while!

Benutzeravatar
hikaru
Beiträge: 9983
Registriert: 09.04.2008 12:48:59

Re: Dateiinhalt automatisiert veraendern (\n entfernen)

Beitrag von hikaru » 13.02.2018 23:03:05

breakthewall hat geschrieben: ↑ zum Beitrag ↑
13.02.2018 17:24:09
Und was ist dann das: https://www.gnu.org/software/sed/manual/sed.txt ?
Keine Ahnung! Jedenfalls ist es nicht die Manpage von GNU sed wie es aus den Repos von Debian oder Suse installiert wird.

Meillo hat geschrieben: ↑ zum Beitrag ↑
13.02.2018 18:37:47
Coole Loesung und voll POSIX-konform! :-)
Danke für die Blumen, aber ich find's eher hässlich, weil es neben der geforderten POSIX-Konformität so gar nichts mit der Aufgabenstellung zu tun hat.

Die Aufgabe war, eine Datei zu bearbeiten. dd arbeitet aber nicht auf Dateiebene sondern auf Blockebene. Dass man damit trotzdem Dateien bearbeiten kann ist eher ein Nebeneffekt des darunterliegenden Konzepts von *nix.
Diesen Zusammenhang zu durchschauen erfordert mMn zu viel Hintergrundwissen und Grips (z.B. auch darüber, dass eine md5sum 32 Byte lang ist) für ein viel zu triviales Problem. Als Knobelei ist das interessant, aber ich möchte keinen Code verwalten müssen, dessen Autor generell so arbeitet. Da kriege ich Knoten im Hirn.

Ich würde unames truncate-Lösung jederzeit meiner vorziehen, denn erstens sagt da schon der Name des Tools was es tut, zweitens braucht man da kein Wissen über den Inhalt der Datei haben (außer dass da ein LF zu viel drin ist) und drittens hat es aus meiner subjektiven Debiananwenderperspektive keine zusätzlichen Kosten gegenüber dd (beides steckt in Debiancoreutils).

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

Re: Dateiinhalt automatisiert veraendern (\n entfernen)

Beitrag von Meillo » 13.02.2018 23:09:50

Ich stimme deiner Analyse durchaus zu, bloss geht's hier ja um kein reales Problem (fuer das ich truncate(1) auch besser faende), sondern um den Spass und von dem beschert mir deine dd-Loesung deutlich mehr. Und gelernt habe ich durch sie auch mehr. :THX:

Btw: Wenn du bs=1 verwendest (und folglich seek=32), dann arbeitet dd(1) auf einem Stream von Bytes und damit wie jedes andere Text-Programm in Unix auch -- es ist alles nur eine Ansichtssache. ;-)
Use ed(1) once in a while!

Benutzeravatar
hikaru
Beiträge: 9983
Registriert: 09.04.2008 12:48:59

Re: Dateiinhalt automatisiert veraendern (\n entfernen)

Beitrag von hikaru » 13.02.2018 23:47:50

Meillo hat geschrieben: ↑ zum Beitrag ↑
13.02.2018 23:09:50
Btw: Wenn du bs=1 verwendest (und folglich seek=32), dann arbeitet dd(1) auf einem Stream von Bytes und damit wie jedes andere Text-Programm in Unix auch -- es ist alles nur eine Ansichtssache. ;-)
Und als nächstes schreibst du dann mit ed in Brainfuck eine Textverarbeitung, die das komfortabel in curses-Grafik kann. ;)

Antworten