Dateiinhalt automatisiert veraendern (\n entfernen)

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Benutzeravatar
Meillo
Moderator
Beiträge: 8782
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 once in a while!

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
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 once in a while!

Benutzeravatar
hikaru
Moderator
Beiträge: 13559
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: 8782
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 once in a while!

Benutzeravatar
hikaru
Moderator
Beiträge: 13559
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