Discussion:
sed oder awk: Zeilenumbruch entfernen?
(zu alt für eine Antwort)
Ina Schmitz
2006-02-09 07:44:18 UTC
Permalink
Hi NG,

wie kann ich aus einer Datei alle Zeilenumbrüche entfernen?

Mein Versuch
sed 's/$/neuezeile/' in.txt
schreibt mir zwar brav an jedes Zeilenende "neuezeile" dazu,
sed 's/$//' in.txt entfernt dann aber den Zeilenumbruch nicht.
Wie geht das mit sed? Oder awk?

Konkret würde ich gerne alle Vorkommen der Zeichenfolge:
"select count(*)
from
test"
finden. Dabei weiß ich aber nicht, WO in der Zeichenfolge die newlines
vorkommen. Meine Idee wäre also, die gesamte Datei erstmal in eine Zeile zu
schreiben und dann nach dem String "select count(*) from test" zu suchen.
Gibt es dafür eine einfachere Möglichkeit?

Danke für gute Tipps!

Gruß,
Ina
Andreas Kretschmer
2006-02-09 08:01:10 UTC
Permalink
Post by Ina Schmitz
"select count(*)
from
test"
finden. Dabei weiß ich aber nicht, WO in der Zeichenfolge die newlines
vorkommen. Meine Idee wäre also, die gesamte Datei erstmal in eine Zeile zu
da würde ich die aber nicht löschen, sondern durch Leerzeichen ersetzen.

tr '\n' ' '

(ungetestet)


end
Andreas
--
Andreas Kretschmer
Linux - weil ich es mir wert bin!
GnuPG-ID 0x3FFF606C http://wwwkeys.de.pgp.net
Ina Schmitz
2006-02-09 08:51:45 UTC
Permalink
Hi Andreas,

hm, leider kann ich die angehängte dat-Datei nicht öffnen. Welches Programm
brauche ich dafür? Könntest Du Deine Antwort bitte nochmal direkt ohne
Anhang schicken?

Danke und viele Grüße,
Ina
Post by Andreas Kretschmer
Andreas
--
Andreas Kretschmer
Linux - weil ich es mir wert bin!
GnuPG-ID 0x3FFF606C http://wwwkeys.de.pgp.net
Christian Schneider
2006-02-09 09:26:15 UTC
Permalink
Post by Ina Schmitz
Hi Andreas,
hm, leider kann ich die angehängte dat-Datei nicht öffnen. Welches Programm
brauche ich dafür?
Einen brauchbaren Newsreader.
J. Seyfferth
2006-02-09 10:46:59 UTC
Permalink
Post by Christian Schneider
Post by Ina Schmitz
hm, leider kann ich die angehängte dat-Datei nicht öffnen. Welches Programm
brauche ich dafür?
Einen brauchbaren Newsreader.
Oder zumindest mal http://oe-faq.de/?56FAQ:2.11 lesen.
--
Mit freundlichen Gruessen
J. Seyfferth

Aktionsseite des Pro Trinitron e.V.
http://www.forwiss.uni-passau.de/~berberic/trinitron.html
J. Seyfferth
2006-02-09 09:45:56 UTC
Permalink
Hallo,
Post by Ina Schmitz
wie kann ich aus einer Datei alle Zeilenumbrüche entfernen?
[...]
Wie geht das mit sed? Oder awk?
[...]
sed ':;s/\n/ /;N;T' sql.txt

Ein Zeilenumbruch wird so durch ein Leerzeichen ersetzt.
--
Mit freundlichen Gruessen
J. Seyfferth

Aktionsseite des Pro Trinitron e.V.
http://www.forwiss.uni-passau.de/~berberic/trinitron.html
Ina Schmitz
2006-02-09 11:39:18 UTC
Permalink
Hallo zusammen,

erstmal vielen Dank für die schnelle Hilfe! Um nen anderen Newsreader werde
ich mich demnächst auch kümmern :-)

Mittlerweile klappt es auch, dass ich die Newlines ersetze. Leider stehe ich
nun vor einem neuen Problem. Wann immer in meinem Dokument "select count(*)
from test" auftaucht, möchte ich die vierte Spalte nach dem nächsten
"total"-Eintrag erhalten.
select count(*)
from
test
call count cpu elapsed disk query current
rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.00 0.00 0 0 0
0
Execute 1 0.00 0.00 0 0 0
0
Fetch 2 0.03 0.02 0 380 0
1
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 4 0.03 0.02 0 380 0

Die vierte Spalte nach /total/ zu selektieren, ging ganz prima, solange
/total/ in einer extra Zeile stand.
Nachdem ich nun meine Datei aber so präpariert habe, dass alles in einer
Zeile steht, erhalte ich als Ausgabe leider die 4. Spalte NACH dem
Dateianfang und nicht nach dem ersten Vorkommen von "total" nach "select
count(*) from test".
Mein Beispielskript war:
sed ':;s/\n/ /;N;T' test.txt > in2.txt
awk '/select count(*) from rass_sources/ { found = "true" }
/total/ { if ( found ~ "true" ) print $4; found = "false" }'
in2.txt

Hat da jemand noch einen guten Rat an einen Newbie? ;-)

Danke und viele Grüße,
Ina
Post by Ina Schmitz
Hi NG,
wie kann ich aus einer Datei alle Zeilenumbrüche entfernen?
Mein Versuch
sed 's/$/neuezeile/' in.txt
schreibt mir zwar brav an jedes Zeilenende "neuezeile" dazu,
sed 's/$//' in.txt entfernt dann aber den Zeilenumbruch nicht.
Wie geht das mit sed? Oder awk?
"select count(*)
from
test"
finden. Dabei weiß ich aber nicht, WO in der Zeichenfolge die newlines
vorkommen. Meine Idee wäre also, die gesamte Datei erstmal in eine Zeile
zu schreiben und dann nach dem String "select count(*) from test" zu
suchen.
Gibt es dafür eine einfachere Möglichkeit?
Danke für gute Tipps!
Gruß,
Ina
J. Seyfferth
2006-02-09 19:19:08 UTC
Permalink
Post by Ina Schmitz
Hallo zusammen,
erstmal vielen Dank für die schnelle Hilfe! Um nen anderen Newsreader werde
ich mich demnächst auch kümmern :-)
Mittlerweile klappt es auch, dass ich die Newlines ersetze. Leider stehe ich
nun vor einem neuen Problem. Wann immer in meinem Dokument "select count(*)
from test" auftaucht, möchte ich die vierte Spalte nach dem nächsten
"total"-Eintrag erhalten.
select count(*)
from
test
call count cpu elapsed disk query current
rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.00 0.00 0 0 0
0
Execute 1 0.00 0.00 0 0 0
0
Fetch 2 0.03 0.02 0 380 0
1
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 4 0.03 0.02 0 380 0
Die vierte Spalte nach /total/ zu selektieren, ging ganz prima, solange
/total/ in einer extra Zeile stand.
Nachdem ich nun meine Datei aber so präpariert habe, dass alles in einer
Zeile steht, erhalte ich als Ausgabe leider die 4. Spalte NACH dem
Dateianfang und nicht nach dem ersten Vorkommen von "total" nach "select
count(*) from test".
sed ':;s/\n/ /;N;T' test.txt > in2.txt
awk '/select count(*) from rass_sources/ { found = "true" }
/total/ { if ( found ~ "true" ) print $4; found = "false" }'
in2.txt
Hat da jemand noch einen guten Rat an einen Newbie? ;-)
--- cut here ---
#!/bin/bash

S="select count(\*)"
F="from"
T="test"
FILE="sql.txt"

sed -n "/$S/{/$F/{/$T/{p;d};N;/$T/{s/\n/ /; \
p;d};p;d};h;n;/$F/{/$T/{H;x;s/\n/ /g; \
p;d};H;n;/$T/{H;x;s/\n/ /g;p;d};H;x;p; \
d};H;x;p;d};p" $FILE | \
awk '/select count\(\*\) from test/ { found = "true" } /total/ \
{ if ( found ~ "true" ) print $4; found = "false" }'
--- cut here ---

sed setzt hier _nur_ das SQL-Statement in eine Zeile zusammen, der Rest
bleibt unveraendert und reicht dann alles an awk durch ohne es
zwischendurch in eine Datei zu schreiben.

Have fun.

$ sed --version | head -n 1
GNU sed version 4.1.4

$ awk --version | head -n 1
GNU Awk 3.1.4

$ head --version | head -n 1
head (coreutils) 5.2.1
--
Mit freundlichen Gruessen
J. Seyfferth

Aktionsseite des Pro Trinitron e.V.
http://www.forwiss.uni-passau.de/~berberic/trinitron.html
Ina Schmitz
2006-02-09 20:13:12 UTC
Permalink
Super, danke, das hat mir sehr geholfen!

LG
Ina

Loading...