Shellskript: Leerzeichen und Zeilenumbrüche entfernen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
fabske
Beiträge: 2023
Registriert: 14.06.2003 15:07:51

Shellskript: Leerzeichen und Zeilenumbrüche entfernen

Beitrag von fabske » 05.02.2008 00:44:22

Ich bin auf der Suche nach einem Shellskript das mir folgendes macht: Ich übergebe dem Skript eine Textdatei, es entfernt alle Leerzeichen und Zeilenumbrüche in der Textdatei und speichert sie wieder unter dem selben Namen. Hat jemand eine Idee?
Danke
Bevor Du einen Beitrag postest:
- Kennst Du unsere Verhaltensregeln?
- Hast Du die Suchfunktion benutzt? Deine Frage wurde vielleicht schon in einem anderen Beitrag beantwortet.
- Ist schon ein Artikel in unserem Wiki vorhanden, der Deine Frage beantwortet?

Benutzeravatar
armin
Beiträge: 2682
Registriert: 17.03.2005 11:49:14

Beitrag von armin » 05.02.2008 01:26:20

Code: Alles auswählen

tr -d '\r\n '
Alternativ geht es auch it sed.
Formerly known as Trigger.
HP 8510p - Debian Sid
Mitglied des Debian-KDE-Teams

Methusalix

Beitrag von Methusalix » 05.02.2008 01:32:18

Code: Alles auswählen

cat text.txt | tr -d [:space:]

Benutzeravatar
fabske
Beiträge: 2023
Registriert: 14.06.2003 15:07:51

Beitrag von fabske » 05.02.2008 12:49:38

Vielen Dank für eure Hilfe! Leider habe ich einen kleinen Fehler gemacht. Also Zeilenumbrüche sollen komplett entfernt werden, aber Leerzeichen nicht alle, sondern nur auf die Anzahl 1 reduziert. Also 5 Leerzeichen in Folge sollen auf eines reduziert werden Alternativ kann man auch alle entfernen, außer diejenigen zwischen zwei Tags, aber dann muss man viel aufwendiger parsen. Hier ein Beispiel einer Textdatei ;)

Code: Alles auswählen

<html>
  <head>
    <tag>Ich bin ein Idiot</tag>
  </head>
</html>
Die Leerzeichen sollen reduziert und Zeilenumbrüche entfernt werden, so dass es danach so aussieht:

Code: Alles auswählen

<html> <head> <tag>Ich bin ein Idiot</tag> </head></html>
Das ganze als Shellskript, sodass ich per * gleich mal 10 Dateien reingeben kann und 10 wieder rausbekomm:

Code: Alles auswählen

#!/bin/bash
cat $i | tr -d '\n' > $i
so vielleicht?

Das ist jetzt noch ohne die Leerzeichenbehandlung, aber wenigstens schon mal die Zeilenumbrüche draußen. Viel mehr kann man auch nicht mehr machen, um den Kode unkenntlich zu machen. Es geht mir nämlich darum, den Wiederverwendungswert meiner html Dateien zu senken.
Bevor Du einen Beitrag postest:
- Kennst Du unsere Verhaltensregeln?
- Hast Du die Suchfunktion benutzt? Deine Frage wurde vielleicht schon in einem anderen Beitrag beantwortet.
- Ist schon ein Artikel in unserem Wiki vorhanden, der Deine Frage beantwortet?

Benutzeravatar
armin
Beiträge: 2682
Registriert: 17.03.2005 11:49:14

Beitrag von armin » 05.02.2008 13:02:27

mohameth hat geschrieben:Es geht mir nämlich darum, den Wiederverwendungswert meiner html Dateien zu senken.
So what? Jemand der Interesse daran hat lässt sich den HTML-Code einfach formatieren und gut ist. Gewonnen hast du damit nichts.
Formerly known as Trigger.
HP 8510p - Debian Sid
Mitglied des Debian-KDE-Teams

Benutzeravatar
fabske
Beiträge: 2023
Registriert: 14.06.2003 15:07:51

Beitrag von fabske » 05.02.2008 13:26:44

Trigger. hat geschrieben:
mohameth hat geschrieben:Es geht mir nämlich darum, den Wiederverwendungswert meiner html Dateien zu senken.
So what? Jemand der Interesse daran hat lässt sich den HTML-Code einfach formatieren und gut ist. Gewonnen hast du damit nichts.
Kann man den automatisch formatieren lassen?
Bevor Du einen Beitrag postest:
- Kennst Du unsere Verhaltensregeln?
- Hast Du die Suchfunktion benutzt? Deine Frage wurde vielleicht schon in einem anderen Beitrag beantwortet.
- Ist schon ein Artikel in unserem Wiki vorhanden, der Deine Frage beantwortet?

BermudaHonk
Beiträge: 184
Registriert: 21.09.2005 10:43:37
Wohnort: Dresden

Beitrag von BermudaHonk » 05.02.2008 13:27:57

Hi,
Leerzeichen kannst Du mit diesem sed-Konstrukt entfernen:

Code: Alles auswählen

cat beispieltext.txt |sed "s/\ \{1,\}/ /g;"
Trigger hat hier natürlich recht. Das hilft Dir nicht wirklich.

Gruß, BermudaHonk
The only Microsoft product ever to ship that doesn't suck will probably be a vacuum cleaner!

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 06.02.2008 10:34:41

So kann man die Leerzeichen entfernen. Eigentlich sollte man doch auch mit sed noch den Zeilenumbruch entfernen können, indem man noch ein -e anhängt mit dem entsprechenden Befehl (bekomme es aber irgendwie auch nicht hin, warum weiß ich allerdings noch nicht).

Mit perl am Ende funktioniert es allerdings

Code: Alles auswählen

... | perl -pe 's/\n//g'
Wieso nicht mit sed?
Oh, yeah!

BermudaHonk
Beiträge: 184
Registriert: 21.09.2005 10:43:37
Wohnort: Dresden

Beitrag von BermudaHonk » 06.02.2008 13:46:48

Hi,
sed arbeitet Zeilenweise und entfernt das "newline" bevor die Zeile in den Speicher gelesen wird. Daher greift das Muster so nicht. Nach Beendigung aller Editorkommandos wird das Ergebnis auf die Standardausgabe geschrieben, wobei das "newline" wieder angehängt wird.

Gruß, BermudaHonk
The only Microsoft product ever to ship that doesn't suck will probably be a vacuum cleaner!

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 06.02.2008 15:58:18

Und wie kann man es mit sed lösen?
Oh, yeah!

Benutzeravatar
finupsen
Beiträge: 1327
Registriert: 21.04.2004 20:07:05
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Dortmund
Kontaktdaten:

Beitrag von finupsen » 06.02.2008 16:07:49

hallo,

Was newline betrifft - mit tr geht das ganz gut:

Code: Alles auswählen

tr -d '\n' < datei  
mit sed auch:

Code: Alles auswählen

sed ':a;N;$!ba;s/\n//g' datei 
kann man hier nachlesen (unter 5.10) : http://faqs.cs.uu.nl/na-dir/editor-faq/sed.html
Niemand hat vor eine zentrale Datensammelbehörde aufzubauen. Es handelt sich vielmehr um dezentrale IT-Systeme die miteinander vernetzt werden.
... und Wasser ist naß.

BermudaHonk
Beiträge: 184
Registriert: 21.09.2005 10:43:37
Wohnort: Dresden

Beitrag von BermudaHonk » 06.02.2008 16:11:25

Hi,
man schmeißt seinen bevorzugten Browser an und googelt ein paar Sekunden lang :)

Code: Alles auswählen

sed ':a;N;$!ba;s/\n//g' Beispieldatei.txt
Das hab ich vom Unixboard abgeschrieben. Ich kann mich noch entsinnen einmal etwas anderes verwendet zu haben. Es war ein Stückchen kürzer und ich meine ich hatte damals auch "newlines" entfernt. Sonst mache ich es einfach mit tr wie die meisten hier.

Gruß, BermudaHonk

===============
ach, da war ja finupsen schneller zur Stelle :)
The only Microsoft product ever to ship that doesn't suck will probably be a vacuum cleaner!

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 06.02.2008 16:20:14

Danke, danke.

Dann werde ich mir die genaue Erklärung zu den einzelnen Optionen noch mal raus suchen und durchlesen.
(mit perl funktioniert es hier auch einfacher, ähnlich wie bei tr)
Oh, yeah!

Benutzeravatar
finupsen
Beiträge: 1327
Registriert: 21.04.2004 20:07:05
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Dortmund
Kontaktdaten:

Beitrag von finupsen » 06.02.2008 16:23:33

Jetzt wäre es noch ganz interessant zu wissen, was da genau passiert ;)

:a = sprungziel (a = label)
ba = ein sprung (a = label)
!$ = aber nicht die letzte zeile
N = hänge ein newline an

und das was dabei rauskommt bekommt ein ganz normales /s\n//g

Die frage ist wie das genau funktioniert. Wo kommt was rein, wo wird gesprungen usw ...
Vor allem verstehe ich den zusammenhang von N nicht so ganz.

Code: Alles auswählen

':a;N;$!ba;s/\n//g'
Niemand hat vor eine zentrale Datensammelbehörde aufzubauen. Es handelt sich vielmehr um dezentrale IT-Systeme die miteinander vernetzt werden.
... und Wasser ist naß.

Antworten