Moin zusammen, hier bin ich wieder, um euch mit sed-newbie-Problemen zu nerven. Nur vornweg, ich habs wirklich versucht. Hab ne Stunde lang mit man-Seite und "Linux in a Nutshell" versucht, einen einzigen (imho simplen) sed-befehl ausgeführt zu kriegen. Leider erfolglos, daher poste ichs hier, so plz dont flame me... Ich möchte ans Ende einer jeden Zeile einer datei etwas anfügen. Ich entnehme folgendes: sed -e #So muß das ganze beginnen /muster/ #Falls ich nach einem Muster suchen will. #Lass ich es weg, werden alle zeilen genommen a\text #Hier sage ich sed, er soll text anhängen datei1 #Mit dieser datei soll es gemacht werden datei2 #In diese datei das Ergebnis Mein Befehl: sed -e /muster/a\text datei1 > datei2 Die shell meldet: sed: -e expression #1, char 8: Extra characters after command Habs auch auf ca 50 anderen Wegen versucht: sed -e a\text datei1 > datei2 #Also für jede Zeile sed -e /muster/a\ datei1 > datei2 #Wartete auf Eingabeaufforderung für text sed -e /muster/a\text datei1 #Auch mal ohne zieldatei ....und noch many more... Vielleicht hat auch einfach einer ne URL von einer brauchbaren Beispielseite. Beispiele wie "$a\ Fügt text an letzte Zeile an .....blablablub" nützen halt überhaupt nix, wenn man den Befehl in seiner kompletten syntax nicht hinbekommt. Thx, Bernd -- One OS to rule them all, one OS to find them. One OS to bring them all, and in the darkness bind them In the land of Redmond, where the shadows lie.
On Thu, 2003-07-31 at 11:22, Bernd Tannenbaum wrote:
Moin zusammen,
hier bin ich wieder, um euch mit sed-newbie-Problemen zu nerven. Nur vornweg, ich habs wirklich versucht. Hab ne Stunde lang mit man-Seite info sed
und "Linux in a Nutshell" versucht, einen einzigen (imho simplen) sed-befehl ausgeführt zu kriegen. Leider erfolglos, daher poste ichs hier, so plz dont flame me...
Ich möchte ans Ende einer jeden Zeile einer datei etwas anfügen.
sed -e 's/$/string/g' infile.txt > outfile.txt Ralf
Bernd Tannenbaum <tannenbaum@service.itenos.de>:
Ich möchte ans Ende einer jeden Zeile einer datei etwas anfügen. sed -e /muster/a\text datei1 > datei2 Die shell meldet: sed: -e expression #1, char 8: Extra characters after command bei mir nicht :-)
sed -e'/vollmer/a\abc' /etc/passwd das fügt nach der Zeile mit "vollmer" eine _neue_ Zeile mit Inhalt abc an. Das a Kommando macht also nicht das gewünschte. Ans Ende der Zeile was anfügen: sed -e's/^\(vollmer.*$\)/\1abc/' /etc/passwd ------------|-------| == Zeile, die mit 'vollmer' beginnt \1 im Ersetzungstext referenziert auf den Inhalt der ersten öffenden Klammer \( \2 auf die zweite usw: s/\(abc\(.*\)\) \1 == abc, \2 == was auf .* passt Jürgen -- Dr.rer.nat. Juergen Vollmer, Viktoriastrasse 15, D-76133 Karlsruhe Tel: +49(721) 9204871 Fax: +49(721) 24874 juergen.vollmer@[informatik-vollmer.de|alumni.uni-karlsruhe.de|acm.org] www.informatik-vollmer.de
Hullos, Am Donnerstag, 31. Juli 2003 11:52 schrieb Jürgen Vollmer:
Bernd Tannenbaum <tannenbaum@service.itenos.de>:
Ich möchte ans Ende einer jeden Zeile einer datei etwas anfügen. sed -e /muster/a\text datei1 > datei2 Die shell meldet: sed: -e expression #1, char 8: Extra characters after command
bei mir nicht :-)
Seltsam, Seltsam. habs grad nochmal mit deinem Kommand probiert. Dieselbe Fehlermeldung.
sed -e'/vollmer/a\abc' /etc/passwd das fügt nach der Zeile mit "vollmer" eine _neue_ Zeile mit Inhalt abc an. Das a Kommando macht also nicht das gewünschte.
okay, das stand so nich beschrieben. thx für die Info, dann werd ich wohl mit "s" arbeiten müssen.
Ans Ende der Zeile was anfügen:
sed -e's/^\(vollmer.*$\)/\1abc/' /etc/passwd ------------|-------| == Zeile, die mit 'vollmer' beginnt \1 im Ersetzungstext referenziert auf den Inhalt der ersten öffenden Klammer \( \2 auf die zweite usw: s/\(abc\(.*\)\) \1 == abc, \2 == was auf .* passt
werd damit experimentieren, thx. Bernd -- One OS to rule them all, one OS to find them. One OS to bring them all, and in the darkness bind them In the land of Redmond, where the shadows lie.
Hallo, On Thu, 31 Jul 2003, Jürgen Vollmer schrieb:
Bernd Tannenbaum <tannenbaum@service.itenos.de>:
Ich möchte ans Ende einer jeden Zeile einer datei etwas anfügen. sed -e /muster/a\text datei1 > datei2 Die shell meldet: sed: -e expression #1, char 8: Extra characters after command bei mir nicht :-)
Dann ist dein sed defekt. Was sagt 'sed -V'? -dnh -- SuSE verscheuert eine Bastardisierung eines zusammenkopierten Softwarehaufens, wo zufällig auch der Linux Kernel drin vorkommt. -- fefe in dcsm
Bernd Tannenbaum wrote:
Moin zusammen,
hier bin ich wieder, um euch mit sed-newbie-Problemen zu nerven. Nur vornweg, ich habs wirklich versucht. Hab ne Stunde lang mit man-Seite und "Linux in a Nutshell" versucht, einen einzigen (imho simplen) sed-befehl ausgeführt zu kriegen. Leider erfolglos, daher poste ichs hier, so plz dont flame me...
Ich möchte ans Ende einer jeden Zeile einer datei etwas anfügen. Ich entnehme folgendes: sed -e #So muß das ganze beginnen
/muster/ #Falls ich nach einem Muster suchen will. #Lass ich es weg, werden alle zeilen genommen a\text #Hier sage ich sed, er soll text anhängen datei1 #Mit dieser datei soll es gemacht werden datei2 #In diese datei das Ergebnis
sed -e Zeigt and, dass der sed Befehl auf der Zeile folgt. Die sed Befehle sind im Prinzip wie folgt aufgebaut befehl/suchmuster/ersatztext/ In deinem Fall wäre dies: befehl = s (substitute / ersetze) suchmuster = $ (Ganze Zeile) ersatztext = Was immer Du willst Also: sed -e 's/$/neues Zeilenende/' Gruss Werner
Vielleicht hat auch einfach einer ne URL von einer brauchbaren Beispielseite. Beispiele wie "$a\ Fügt text an letzte Zeile an .....blablablub" nützen halt überhaupt nix, wenn man den Befehl in seiner kompletten syntax nicht hinbekommt.
Weiss im Moment auch nix
Thx, Bernd
Hullos und thx schonmal, Am Donnerstag, 31. Juli 2003 13:43 schrieb SuSE:
Bernd Tannenbaum wrote:
Moin zusammen, Ich möchte ans Ende einer jeden Zeile einer datei etwas anfügen.
Also:
sed -e 's/$/neues Zeilenende/'
Okay, kapier ich nich ganz. Funktioniert (habs grad probiert) aber is ja nicht was ich will. Die "s" Funktion ersetzt, ich will jedoch etwas anhängen und später auch etwas vorwegschreiben und vor allem das ganze verstehen. Dazu sind doch für sed explizit die Funktionen "a\" sowie "i\" aufgeführt. Gibt es die gar nicht, ich mein die stehen doch sogar in den man-Seiten, können doch keine Erfindung sein oder doch? Bernd -- One OS to rule them all, one OS to find them. One OS to bring them all, and in the darkness bind them In the land of Redmond, where the shadows lie.
On Thu, 2003-07-31 at 13:43, SuSE wrote:
Bernd Tannenbaum wrote:
Vielleicht hat auch einfach einer ne URL von einer brauchbaren Beispielseite. Beispiele wie "$a\ Fügt text an letzte Zeile an .....blablablub" nützen halt überhaupt nix, wenn man den Befehl in seiner kompletten syntax nicht hinbekommt.
Weiss im Moment auch nix
Beispiel: Testdatensatz: # cat test.txt a b c e hugo f g h i # sed -e '/ hugo /a\hallo\ welt' test.txt a b c e hugo f hallo welt g h i Achtung: Die sed Zeile besteht aus einer Zeile, die über 2 Zeilen umgebrochen ist (Also: <Backslash>hallo<Backslash><\n>welt) Etwas übersichtlicher wird das Ganze als sed-Script: # cat script.sed / hugo /a\hallo\ welt # sed -f script.sed test.txt ... Ralf
Hallo, On Thu, 31 Jul 2003, Ralf Corsepius schrieb:
# sed -e '/ hugo /a\hallo\ welt' test.txt
*autsch* Und das von dir... Sag mir bitte, dass das ein RH-patch ist... Korrekt ist: sed -e '/ hugo /a\ hallo\ welt' test.txt -dnh -- Ashamed of it? Perhaps you're an MCSE? I'm pretty sure that even a pot plant could pass that test, so if you said you were an MCSE I'd be quite likely to actually believe you. -- Lionel, asr
On Fri, 2003-08-01 at 03:14, David Haller wrote:
Hallo,
On Thu, 31 Jul 2003, Ralf Corsepius schrieb:
# sed -e '/ hugo /a\hallo\ welt' test.txt
*autsch* Und das von dir... ???
Sag mir bitte, dass das ein RH-patch ist... Keine Ahnung, wovon Du redest.
Korrekt ist:
Keine Ahnung, warum DAS korrekt sein soll.
sed -e '/ hugo /a\ hallo\ welt' test.txt
Ralf
Hallo, On Fri, 01 Aug 2003, Ralf Corsepius schrieb:
On Fri, 2003-08-01 at 03:14, David Haller wrote:
On Thu, 31 Jul 2003, Ralf Corsepius schrieb:
# sed -e '/ hugo /a\hallo\ welt' test.txt [..] Sag mir bitte, dass das ein RH-patch ist... Keine Ahnung, wovon Du redest.
Dass dein sed ein 'a\text' akzeptiert. $ echo 'abc' | sed 'a\x' sed: -e expression #1, char 3: Extra characters after command -dnh -- Wer unkasprige Kaspereien verbreitet darf sich nicht wundern wenn der grosse Kasper mit der Klatsche zuschlägt. [Woko° in dag°]
David Haller schrieb am 01.08.2003 um 18:07:44 +0200: Hallo David,
On Fri, 01 Aug 2003, Ralf Corsepius schrieb:
On Fri, 2003-08-01 at 03:14, David Haller wrote:
On Thu, 31 Jul 2003, Ralf Corsepius schrieb:
# sed -e '/ hugo /a\hallo\ welt' test.txt [..] Sag mir bitte, dass das ein RH-patch ist...
noe. SuSE kann das auch. Zumindest in den Versionen die in der 8.2 und SLES 8 fabie sind. sed -V 3.02.80 Debian Woody, sed -V, 3.02, kann es nicht.
Keine Ahnung, wovon Du redest.
das er mal wieder mit alten Versionen arbeitet :-))
Dass dein sed ein 'a\text' akzeptiert.
$ echo 'abc' | sed 'a\x' sed: -e expression #1, char 3: Extra characters after command
Bis denne, Michael -- ---------------------------------------------------------- Michael Schulz, Institut f. Geophysik, Universität Münster Corrensstr. 24, 48149 Münster Tel.: 0251-8333938, e-mail: michael@earth.uni-muenster.de
On Sat, 2003-08-02 at 13:03, Michael Schulz wrote:
David Haller schrieb am 01.08.2003 um 18:07:44 +0200:
Hallo David,
On Fri, 01 Aug 2003, Ralf Corsepius schrieb:
On Fri, 2003-08-01 at 03:14, David Haller wrote:
On Thu, 31 Jul 2003, Ralf Corsepius schrieb:
# sed -e '/ hugo /a\hallo\ welt' test.txt [..] Sag mir bitte, dass das ein RH-patch ist...
noe. SuSE kann das auch. Zumindest in den Versionen die in der 8.2 und SLES 8 fabie sind.
sed -V 3.02.80
Debian Woody, sed -V, 3.02, kann es nicht.
Keine Ahnung, wovon Du redest.
das er mal wieder mit alten Versionen arbeitet :-))
# sed -V GNU sed version 4.0.5 :)
Dass dein sed ein 'a\text' akzeptiert. Aha, nun verstehe ich. Das Beispiel war in "2 Minuten" hingescribbelt, ohne gross darüber nachzudenken und lief klaglos unter RH-9 - Unter Solaris5.7 läuft es nicht, aber auch das Solaris sed kennt a\
Keine Ahnung, was die Standards zu a\text sagen, ob sich da die Standards geändert haben, oder aber das ein Bug in neueren gnu-seds ist. Im Allgemeinen ist sed sowieso grauenvoll unportabel und viele sed-Implementationen derart fehlerträchtig, das man gut daran tut, derartige "Fortgeschrittene Features" zu vermeiden, wenn es portabel sein soll :-)
$ echo 'abc' | sed 'a\x' sed: -e expression #1, char 3: Extra characters after command
# echo 'abc' | sed 'a\x' abc x Ralf
Hallo, On Sun, 03 Aug 2003, Ralf Corsepius schrieb:
On Sat, 2003-08-02 at 13:03, Michael Schulz wrote:
David Haller schrieb am 01.08.2003 um 18:07:44 +0200:
On Fri, 01 Aug 2003, Ralf Corsepius schrieb:
On Fri, 2003-08-01 at 03:14, David Haller wrote:
On Thu, 31 Jul 2003, Ralf Corsepius schrieb:
# sed -e '/ hugo /a\hallo\ welt' test.txt [..] Sag mir bitte, dass das ein RH-patch ist...
noe. SuSE kann das auch. Zumindest in den Versionen die in der 8.2 und SLES 8 fabie sind.
sed -V 3.02.80
Debian Woody, sed -V, 3.02, kann es nicht.
Jo. Ich hab hier ja auch die 3.02.
Keine Ahnung, wovon Du redest.
das er mal wieder mit alten Versionen arbeitet :-))
# sed -V GNU sed version 4.0.5
:)
Huch! Als ich's letzte mal geschaut habe war noch 3.02.80 aktuell... "Ewig" tut sich nix, und dann auf einmal... *tsk* ;)
Dass dein sed ein 'a\text' akzeptiert. Aha, nun verstehe ich. Das Beispiel war in "2 Minuten" hingescribbelt, ohne gross darüber nachzudenken und lief klaglos unter RH-9 - Unter Solaris5.7 läuft es nicht, aber auch das Solaris sed kennt a\
Bingo ;)
Keine Ahnung, was die Standards zu a\text sagen, ob sich da die Standards geändert haben, oder aber das ein Bug in neueren gnu-seds ist.
AFAIK ist 'a' ein Standardbefehl, aber eben mit der Syntax a\<NEWLINE> text ebenso wie 'i' und 'c'.
Im Allgemeinen ist sed sowieso grauenvoll unportabel und viele sed-Implementationen derart fehlerträchtig, das man gut daran tut, derartige "Fortgeschrittene Features" zu vermeiden, wenn es portabel sein soll :-)
Naja, wenn man sich an die Standardsyntax haelt ist sed schon portabel. Die Leuts in dcou.shell sollten da aber genaueres wissen.
$ echo 'abc' | sed 'a\x' sed: -e expression #1, char 3: Extra characters after command # echo 'abc' | sed 'a\x' abc x
Eben. Das ist eine (bisher) nicht standardkonforme Erweiterung, die vermutlich deswegen eingebaut wurde, weil die "User" nicht geschnallt haben, dass nach dem '\' ein Zeilenumbruch hin muss... -dnh -- Kasper Unser im Usenet, geheiligt werde Deine Newsgroup, Dein Posting komme, Deine Reply geschehe. Wie im Usenet, so im RL. Unsern täglichen Newsfeed gib uns heute und vergib uns unsere Logik, wie auch wir vergeben den Logikern. Denn Dein ist das Usenet und die MID, auf Deja.com. Amen [Peter Schlömer dateka 24.7.1999]
On Mon, 2003-08-04 at 15:39, David Haller wrote:
Keine Ahnung, was die Standards zu a\text sagen, ob sich da die Standards geändert haben, oder aber das ein Bug in neueren gnu-seds ist.
AFAIK ist 'a' ein Standardbefehl, aber eben mit der Syntax
a\<NEWLINE> text
ebenso wie 'i' und 'c'.
Im Allgemeinen ist sed sowieso grauenvoll unportabel und viele sed-Implementationen derart fehlerträchtig, das man gut daran tut, derartige "Fortgeschrittene Features" zu vermeiden, wenn es portabel sein soll :-)
Naja, wenn man sich an die Standardsyntax haelt ist sed schon portabel. Auf welchen Standard beziehst Du dich? Sed hat im Laufe der Jahrzehnte einige Änderungen erfahren ...
Die Leuts in dcou.shell sollten da aber genaueres wissen. Die autoconf-Leute auch :)
Hauptproblem mit "portablen" sed-Scripten: Hart-codierte Puffergrössen: Viele ältere Sed-Implementationen benutzen erstaunlich kleine interne Arrays/Puffer u.ä. Führt bei sed-Scripten eines gewissen Umfangs zu "obskurem" Verhalten (Im besten Fall hart Abstürze, gelegentlich wird auch ein Teil eines Sed-Scriptes "stillschweigend" nicht abgearbeitet.) Sonst recht gängige Probleme mit sed: * \<int> (Rückverweis) ist nicht portabel. Manche ältere Seds kennen es nicht, manche sed's besitzen nur eine sehr kleine Zahl Puffer für \<int>. * Diverse Probleme bez. i18n (Verarbeitet sed nur ASCII-Dateien oder "TEXT"-Dateien im Allgemeinen? Wie ersetzt man "portabel" ein 'ä' durch ein 'ô'? u.ö.) * \n vs. \n\r: Einige sed-Implementierungen haben Probleme mit der Verarbeitung von "Zeilenenden" (Insbesondere solche auf DOS-ähnlichen Systemen. Manche seds expandieren alle \n in \r\n; Manche seds expandieren "alle \n in gematchten Zeilen" in \r\n). * Diverse Bugs in diversen Implementierungen. Bez. GNU-sed: Besitzt diverse Erweiterungen, die sich in Linux/GNU Entwicklungen "einschleichen" aber nicht portabel sind. Ralf
Hallo, On Thu, 31 Jul 2003, SuSE schrieb: ^^^^ netter Name...
Die sed Befehle sind im Prinzip wie folgt aufgebaut befehl/suchmuster/ersatztext/
Nein. Nur der 's'-Befehl, 's' wie "substituieren". Schau dir dazu bitte mal die sed-Befehle 'p','d','a','i','c','x','h' usw. an.
In deinem Fall wäre dies: befehl = s (substitute / ersetze) suchmuster = $ (Ganze Zeile)
*patsch* Setzen, sechs.
sed -e 's/$/neues Zeilenende/'
_Das_ ist allerdings dann doch richtig. Erstaunlich, wie das manche hinbekommen. [TOFU inkl. SuSE-Footer entsorgt] Lies bitte die Etikette dieser Liste (pointer geht woechentlich durch) und befolge diese. -dnh -- Q: Why is it that New Jersey got all the toxic waste dumps and California got all the lawyers? A: New Jersey had first choice. -- unknown
Hallo David, * David Haller schrieb am 01.Aug.2003:
On Thu, 31 Jul 2003, SuSE schrieb: ^^^^ netter Name...
Susanne?
In deinem Fall wäre dies: befehl = s (substitute / ersetze) suchmuster = $ (Ganze Zeile)
*patsch* Setzen, sechs.
Schreib bitte auch dazu, warum: $ im Suchmuster steht *nicht* für die ganze Zeile, sondern für das Ende der Zeile.
sed -e 's/$/neues Zeilenende/'
_Das_ ist allerdings dann doch richtig. Erstaunlich, wie das manche hinbekommen.
@Alle: Ja. Wenn da wirklich ganze Zeile stände, so würde sie ja ersetzt, es soll aber nur angehangen werden. Wird mit obigen Befehl auch gemacht, da $ nicht für die ganze Zeile steht, sondern für das Zeilenende. Es wird gewissermaßen das (virtuelle Zeichen) Zeilenende durch "neues Zeilenende" ersetzt. Also angehangen. Bernd
Hi Bernd, ich habe das anhängen alleine mal ausprobiert und es funktioniert, hängt allerdings an jede Zeite was an. wie wäre es, wenn Du einfach mit pipes arbeitest. Sed scheint nicht mehrere Dinge gleichzeitig tun zu können. Die Quelle die ich Dir gestern geschickt habe scheint zu funktionieren. Das könnte dann so aussehen: Das folgende Ding ersetzt foo durch bar in jeder zeile im file file.txt , dann wird das ergebnis ind jeder zeile um joe erweitert und in file_new.txt geschrieben. sed -e s/foo/bar/g file.txt | sed a\joe >file_new.txt Übrigens um etwas an einen Datei anzuhängen benutze einfach cat. Bernd Tannenbaum wrote:
Moin zusammen,
hier bin ich wieder, um euch mit sed-newbie-Problemen zu nerven. Nur vornweg, ich habs wirklich versucht. Hab ne Stunde lang mit man-Seite und "Linux in a Nutshell" versucht, einen einzigen (imho simplen) sed-befehl ausgeführt zu kriegen. Leider erfolglos, daher poste ichs hier, so plz dont flame me...
Ich möchte ans Ende einer jeden Zeile einer datei etwas anfügen. Ich entnehme folgendes: sed -e #So muß das ganze beginnen /muster/ #Falls ich nach einem Muster suchen will. #Lass ich es weg, werden alle zeilen genommen a\text #Hier sage ich sed, er soll text anhängen datei1 #Mit dieser datei soll es gemacht werden datei2 #In diese datei das Ergebnis
Mein Befehl: sed -e /muster/a\text datei1 > datei2 Die shell meldet: sed: -e expression #1, char 8: Extra characters after command Habs auch auf ca 50 anderen Wegen versucht: sed -e a\text datei1 > datei2 #Also für jede Zeile sed -e /muster/a\ datei1 > datei2 #Wartete auf Eingabeaufforderung für text sed -e /muster/a\text datei1 #Auch mal ohne zieldatei ....und noch many more...
Vielleicht hat auch einfach einer ne URL von einer brauchbaren Beispielseite. Beispiele wie "$a\ Fügt text an letzte Zeile an .....blablablub" nützen halt überhaupt nix, wenn man den Befehl in seiner kompletten syntax nicht hinbekommt.
Thx, Bernd
Hi Hape :) Am Donnerstag, 31. Juli 2003 18:09 schrieb hape zerres:
Hi Bernd, ich habe das anhängen alleine mal ausprobiert und es funktioniert, hängt allerdings an jede Zeite was an.
Weiß auch nicht, weshalb mein sed fehler ausgibt. Vielleicht ist meine Version gebugged.
wie wäre es, wenn Du einfach mit pipes arbeitest. Sed scheint nicht mehrere Dinge gleichzeitig tun zu können. Die Quelle die ich Dir gestern geschickt habe scheint zu funktionieren. Das könnte dann so aussehen:
Das folgende Ding ersetzt foo durch bar in jeder zeile im file file.txt , dann wird das ergebnis ind jeder zeile um joe erweitert und in file_new.txt geschrieben. sed -e s/foo/bar/g file.txt | sed a\joe >file_new.txt
Jop, habe inzwischen mitgeteilt bekommen, das a\ in eine neue Zeile anhängt und das will ich ja nicht. Werde also wie mir die meisten hier vorschlugen mit "s" arbeiten.
Übrigens um etwas an einen Datei anzuhängen benutze einfach cat.
Okay, das krieg ich auch noch (grad so) hin... :) ################# Und für dich, Hape, hier ein spezieller Informatikerwitz: Zwei Informatikstudenten treffen sich auf dem Campus. Sagt der eine: "Hey, woher hast du das schöne neue Fahrrad?" Antwortet der andere: " Nun, ich lief gestern durch den Park, als eine wunderschöne Blondine auf dem Fahrrad vor mir anhielt, sich nackt auszog und sagte: Nimm dir was du willst! " Sagt der erste: "Gute Wahl, die Kleider hätten bestimmt nicht gepasst." Woher hast du eigentlich dein neues Fahrrad *SCNR* Bis denne, Bernd -- One OS to rule them all, one OS to find them. One OS to bring them all, and in the darkness bind them In the land of Redmond, where the shadows lie.
Am Don, 2003-07-31 um 12.25 schrieb Bernd Tannenbaum:
Hi Hape :)
Am Donnerstag, 31. Juli 2003 18:09 schrieb hape zerres:
Hi Bernd, ich habe das anhängen alleine mal ausprobiert und es funktioniert, hängt allerdings an jede Zeite was an.
Weiß auch nicht, weshalb mein sed fehler ausgibt. Vielleicht ist meine Version gebugged.
Hi Bernd, ich habe das mal kurz überflogen. Kann es vielleicht sein, dass Du das einzelne Hochkomma übersehen hast? sed -e'Kommendo' -e'Kommando2' ... datei > output Das Hochkomma führt dazu, dass die shell, in der Du das Kommando angibst, sich um den Inhalt zwischen den Hochkommata nicht kümmert und an sed weiterreicht. HTH, Wolfgang
Am Don, 2003-07-31 um 12.25 schrieb Bernd Tannenbaum:
Weiß auch nicht, weshalb mein sed fehler ausgibt. Vielleicht ist meine Version gebugged.
Nö, sed 'a\abc' ist nonstandard. Normal muß immer ein newline nach dem '\' kommen, und dann wird der text in eine neue Zeile geschrieben. Neuere sed-Versionen unterstützen aber die 'a\abc' syntax. m.E. aus Portabilitäts-Gründen nicht empfehlenswert. 's/$/abc/' ist auch ok, und geht immer. Martin -- Martin Wilck Phone: +49 5251 8 15113 Fujitsu Siemens Computers Fax: +49 5251 8 20409 Heinz-Nixdorf-Ring 1 mailto:Martin.Wilck@Fujitsu-Siemens.com D-33106 Paderborn http://www.fujitsu-siemens.com/primergy
Okay, hier meine funktionierend lösung fürs Archiv: In einem Verzeichnis liegen die file(s) xxx, die nicht mit einem "." beginnen. Sie sollen per cronjob im Web downloadbar werden. Mein cronjob führt folgendes Script aus: /bin/rm /pfad/index.html /bin/ls /pfad | grep ^[^.] > /pfad/.body1 /bin/sed -e 's/$/">Download<\/a><br>/g' /pfad/.body1 > /pfad/.body2 /bin/sed -e 's/^/<a href="/g' /pfad/.body2 > /pfad/.body3 /bin/cat /pfad/.head > /pfad/index.html /bin/cat /pfad/.body3 >> /pfad/index.html /bin/cat /pfad/.end >> /pfad/index.html Funzt fein, danke an Alle, Bernd -- One OS to rule them all, one OS to find them. One OS to bring them all, and in the darkness bind them In the land of Redmond, where the shadows lie.
Hallo Bernd, From: Bernd Tannenbaum <tannenbaum@service.itenos.de> To: suse-linux@suse.com Subject: Re: schonwieder sed :( - Solved:) Date sent: Thu, 31 Jul 2003 13:12:38 +0200
Okay, hier meine funktionierend lösung fürs Archiv:
In einem Verzeichnis liegen die file(s) xxx, die nicht mit einem "." beginnen. Sie sollen per cronjob im Web downloadbar werden.
Mein cronjob führt folgendes Script aus:
/bin/rm /pfad/index.html /bin/ls /pfad | grep ^[^.] > /pfad/.body1 /bin/sed -e 's/$/">Download<\/a><br>/g' /pfad/.body1 > /pfad/.body2 /bin/sed -e 's/^/<a href="/g' /pfad/.body2 > /pfad/.body3 /bin/cat /pfad/.head > /pfad/index.html /bin/cat /pfad/.body3 >> /pfad/index.html /bin/cat /pfad/.end >> /pfad/index.html
ich hab's ja nicht probiert, aber ich glaube auf der HTML-Seite steht dann nur mehrfach "Download". Es geht glaub' ich einfacher und schoener: /bin/cat /pfad/.head > /pfad/index.html ls /pfad | grep ^[^.] | sed -e 's/^\(.*\)$/<a href="\1">Download \1<\/a><br>/g' \
/pfad/index.html /bin/cat /pfad/.end >> /pfad/index.html
Nicht getestet aber in der HTML Seite sollte dann Download <Dateiname> stehen. sed kann sich gefundene Muster merken - merken im Suchmuster \(<Muster\) merken ein: \( ganze Zeile .* merken aus \) - einfuegen im Ersetzen-Muster \1 (erster Merkbuffer) HTH, Oliver
Hallo auch, Am Donnerstag, 31. Juli 2003 13:48 schrieb Oliver Fuchs:
Hallo Bernd,
From: Bernd Tannenbaum <tannenbaum@service.itenos.de> To: suse-linux@suse.com Subject: Re: schonwieder sed :( - Solved:) Date sent: Thu, 31 Jul 2003 13:12:38 +0200
Okay, hier meine funktionierend lösung fürs Archiv:
In einem Verzeichnis liegen die file(s) xxx, die nicht mit einem "." beginnen. Sie sollen per cronjob im Web downloadbar werden.
Mein cronjob führt folgendes Script aus:
/bin/rm /pfad/index.html /bin/ls /pfad | grep ^[^.] > /pfad/.body1 /bin/sed -e 's/$/">Download<\/a><br>/g' /pfad/.body1 > /pfad/.body2 /bin/sed -e 's/^/<a href="/g' /pfad/.body2 > /pfad/.body3 /bin/cat /pfad/.head > /pfad/index.html /bin/cat /pfad/.body3 >> /pfad/index.html /bin/cat /pfad/.end >> /pfad/index.html
ich hab's ja nicht probiert, aber ich glaube auf der HTML-Seite steht dann nur mehrfach "Download". Es geht glaub' ich einfacher und schoener:
Völlig korrekt. Da es hier nur um eine interne "Spiellösung" ging, hatte mir das gereicht (Nie mehr als 3 oder 4 Dateien). Wenn die Maus über dem Download liegt, zeigt der Browser den echten Dateinamen ja an.
/bin/cat /pfad/.head > /pfad/index.html ls /pfad | grep ^[^.] | sed -e 's/^\(.*\)$/<a href="\1">Download \1<\/a><br>/g' \
/pfad/index.html
/bin/cat /pfad/.end >> /pfad/index.html
Nicht getestet aber in der HTML Seite sollte dann Download <Dateiname> stehen. sed kann sich gefundene Muster merken - merken im Suchmuster \(<Muster\) merken ein: \( ganze Zeile .* merken aus \)
- einfuegen im Ersetzen-Muster \1 (erster Merkbuffer)
Okay, hört sich gut an. Kann ich leider erst morgen ausprobieren, aber wäre natürlich noch das Sahnehäubchen:) Thx für die Mühe, Bernd -- One OS to rule them all, one OS to find them. One OS to bring them all, and in the darkness bind them In the land of Redmond, where the shadows lie.
Hallo, On Thu, 31 Jul 2003, Oliver Fuchs schrieb:
From: Bernd Tannenbaum <tannenbaum@service.itenos.de> [Outlook-Roman gekuerzt]
@Oliver: Die erste Zeile mit dem 'From: ' reicht.
Okay, hier meine funktionierend lösung fürs Archiv:
In einem Verzeichnis liegen die file(s) xxx, die nicht mit einem "." beginnen. Sie sollen per cronjob im Web downloadbar werden.
Mein cronjob führt folgendes Script aus:
/bin/rm /pfad/index.html /bin/ls /pfad | grep ^[^.] > /pfad/.body1 /bin/sed -e 's/$/">Download<\/a><br>/g' /pfad/.body1 > /pfad/.body2 /bin/sed -e 's/^/<a href="/g' /pfad/.body2 > /pfad/.body3 /bin/cat /pfad/.head > /pfad/index.html /bin/cat /pfad/.body3 >> /pfad/index.html /bin/cat /pfad/.end >> /pfad/index.html
Hm. Warum einfach, wenn's auch kompliziert geht? ;) ==== { /bin/cat /pfad/.head; /bin/ls /pfad | sed -e 's/.*/<a href="&">Download<\/a><br>/'; /bin/cat /pfad/.end; } > /pfad/index.html ==== (die ';' an den Zeilenenden sind in einem script nur noetig, wenn zwischen dem letzten Befehl im '{}' Block kein Zeilenumbruch folgt[1].) Hm. Eigentlich muss da ein 'ls /pfad | grep -v 'index\.html' | sed ..' hin ;) Naja, schadet ja nicht weiter, wenn sich index.html selbst referenziert ;) Anmerkungen: 1. durch die "Blockbildung" mittels '{ ...; }' (ohne eine subshell!) kann die gesamte Ausgabe der Befehle darin gemeinsam umgeleitet werden. 2. das 'rm' ist ueberfluessig, da die Datei eh ueberschrieben wird. 3. /bin/ls listet nur auf Befehl (-a/-A) auch .-Dateien. Zumindest wenn du /bin/ls so mit vollem Pfad aufrufst, ein grep -v '^\.' ist also ueberfluessig. 4. Was das '&' im RELACEMENT bedeutet siehe man sed: The replacement may contain the special character & to refer to that portion of the pattern space which matched, Mit der Regexp '.*' im PATTERN steht dort "alles", und das '&' ("alles was passt") enthaelt also die gesamte Zeile, also den Dateinamen. 5. die "schicke" Variante ist fast identisch: | /bin/sed -e 's/.*/<a href="&">Download &<\/a><br>/' hier wird einfach zweimal das '&' verwendet, in dem ja jew. der Dateiname steht. 6. wie man sieht ist die Loesung, die die Mittel der shell und die der anderen Tools richtig einsetzt IMO sogar die einfachste, da keinerlei "Verrenkungen" mehr noetig sind. Und ja, ich weiss aus eigener Erfahrung, dass es nicht leicht ist, eben dies zu tun, da hilft eigentlich nur viel (und genau) lesen und ueben, ueben, ueben und Beispiele nachvollziehen und konstruktive Kritik ;)
ich hab's ja nicht probiert, aber ich glaube auf der HTML-Seite steht dann nur mehrfach "Download". Es geht glaub' ich einfacher und schoener:
/bin/cat /pfad/.head > /pfad/index.html ls /pfad | grep ^[^.]
Useless use of grep (s.o.) und wenn dann waere ein grep -v '^\.\|^index.html$' sinnvoller. Und nebenbei: Argumente immer quoten!
| sed -e 's/^\(.*\)$/<a href="\1">Download \1<\/a><br>/g' \
Useless use of "backreference" (s.o.). Ansonsten gute Loesung. -dnh [1] Generell gilt: In scripten kann ein ';', das shell(!)-Befehle trennt, durch einen Zeilenumbruch ersetzt werden. Und vor einem '}' oder ')' eines '{}' oder '()' Blockes _ist_ ein solcher Trenner (';' oder Zeilenumbruch) notwendig. -- Hm. Libre electricity. "You may do anything you like with this electricity, including but not limited to application to lusers, provided that you pass on these rights to all subsequent users of this electricity." Wonder how that'd work... -- Stuart Lamble in asr, on '220V RMS.'
Hallo, * David Haller schrieb am 01.Aug.2003:
On Thu, 31 Jul 2003, Oliver Fuchs schrieb:
From: Bernd Tannenbaum <tannenbaum@service.itenos.de>
Okay, hier meine funktionierend lösung fürs Archiv:
In einem Verzeichnis liegen die file(s) xxx, die nicht mit einem "." beginnen. Sie sollen per cronjob im Web downloadbar werden.
Mein cronjob führt folgendes Script aus:
/bin/rm /pfad/index.html /bin/ls /pfad | grep ^[^.] > /pfad/.body1 /bin/sed -e 's/$/">Download<\/a><br>/g' /pfad/.body1 > /pfad/.body2 /bin/sed -e 's/^/<a href="/g' /pfad/.body2 > /pfad/.body3 /bin/cat /pfad/.head > /pfad/index.html /bin/cat /pfad/.body3 >> /pfad/index.html /bin/cat /pfad/.end >> /pfad/index.html
Hm. Warum einfach, wenn's auch kompliziert geht? ;)
==== { /bin/cat /pfad/.head; /bin/ls /pfad | sed -e 's/.*/<a href="&">Download<\/a><br>/'; /bin/cat /pfad/.end; } > /pfad/index.html ====
Ihr, Bernd und David habt beide Standardbefehle mit einem Pfad versehen. Bei Befehle wie rm, ls, sed, grep und cat ist dies aber nicht nötig, und sollte imho auch nicht gemacht werden. /bin und /usr/bin stehen von Anfang an im Pfad und wird es auch nicht herausgenommen, wenn nicht was ganz spezielles gemacht wird. Beide habt Ihr es auch nicht durchgängig gemacht. Bernd hat grep und David hat sed ohne Pfad aufgerufen, und zwar beide nach einem | Ihr habt aber in Download ohne Pfadangabe umgelenkt. Das ist doch wohl nicht Euer Ernst. Cronjob ohne Pfadangabe, wohin kommt das eigentlich? Im Homverzeichnis des jeweiligen Users habe ich herausexperimentiert, aber ob das Allgemeingültig ist, weiß ich nicht. Ich gehe mal davon aus, daß Du Bernd nicht wirklich ein Verzeichnis /pfad hast, sondern es nur für irgendeinen Pfad steht. Das macht man am Besten, wenn man es am Anfang des Skriptes eine Variable dafür definiert, etwa so: TEMPDIR=/tmp/cronjob und dann im Skript nur die Variable benutzt:
$TEMPDIR/index.html
TEMPDIR mag in diesem Falle auch die flasche Bezeichnung sein, such Dir was nettes aus. Wichtig ist, daß man es jederzeit einfach ändern kann. Vielleicht auch mehere, TEMPDIR und andere. Auch sollte man darauf Acht geben, daß man nichts ungewollte überschreibt. Bernd -- Bitte die Etikette beachten: http://www.suse-etikette.de.vu/etikette.html Bitte Realnamen angeben, kein Vollquoting, kein Html, PGP oder Visitenkarten benutzen. Signatur mit "-- " abtrennen, bei Antworten "Re: " voranstellen, sonst nichts. |Zufallssignatur 4
On Thu, 2003-07-31 at 18:09, hape zerres wrote:
Das folgende Ding ersetzt foo durch bar in jeder zeile im file file.txt , dann wird das ergebnis ind jeder zeile um joe erweitert und in file_new.txt geschrieben.
sed -e s/foo/bar/g file.txt | sed a\joe >file_new.txt
Du hast sed -e verstanden? ;-) Es geht in einer Zeile: sed -e 's/foo/bar/g' -e 'a\joe' file.txt > file_new.txt Ralf
Hallo, On Thu, 31 Jul 2003, Ralf Corsepius schrieb:
On Thu, 2003-07-31 at 18:09, hape zerres wrote:
Das folgende Ding ersetzt foo durch bar in jeder zeile im file file.txt , dann wird das ergebnis ind jeder zeile um joe erweitert und in file_new.txt geschrieben.
sed -e s/foo/bar/g file.txt | sed a\joe >file_new.txt
Du hast sed -e verstanden? ;-)
Es geht in einer Zeile: sed -e 's/foo/bar/g' -e 'a\joe' file.txt > file_new.txt
_Das_ geht auch in einem Argument: sed -e 's/foo/bar/g;a\ joe' file.txt > file_new.txt -dnh -- "Deine gesigge in Ehren. Aber der Spruch war es nicht Wert. Schliesslich ist eine gute Sig wie ein Schmuckstück das man immer wieder mal vorzeigen sollte. Es sei denn es handelt sich um Imitationen oder Modeschmuck." [WoKo zu Dieter Brügmann in dag°]
Hallo, On Thu, 31 Jul 2003, Bernd Tannenbaum schrieb:
Ich möchte ans Ende einer jeden Zeile einer datei etwas anfügen.
Das hatten wir neulich doch erst... sed 's/$/Blablubb/'.
Ich entnehme folgendes: sed -e #So muß das ganze beginnen /muster/ #Falls ich nach einem Muster suchen will. #Lass ich es weg, werden alle zeilen genommen
Jein. Eigentlich sollte da 'ADRESSE' statt 'MUSTER' stehen. Denn eine Adresse "adressiert" einen Bereich: also ADRESSE := BEGINN,ENDE wobei ',ENDE' optional ist (in dem Fall umfasst der Bereich genau die Zeile, die durch 'BEGINN' ausgewaehlt wird. BEGINN und ENDE koennen jew. eine Zeilennummer (einfach die Zahl, z.B. '1' oder '10'), ein '$' fuer das Dateiende oder eine von '//' eingefasste Regexp sein. Wie die Adressen wirken, probiert man am besten mal mit einer einfachen Eingabe und dem Befehl 'p' durch (Z steht fuer Zeile): x='a\nb\nc\nd\ne\nf\n' echo -en "$x" | sed -n '1,1p' ### Bereich: von Z1 bis Z1 ist gleich: echo -en "$x" | sed -n '1p' ### Bereich: Z1 echo -en "$x" | sed -n '2,4p' ### Bereich: Z2 bis Z4 (inkl.) echo -en "$x" | sed -n '3,$p' ### Bereich: Z3 bis letzte Z echo -en "$x" | sed -n '1,$p' ### Bereich: Z1 bis letzte Z, also ### also aequivalent zu: echo -en "$x" | sed -n 'p' ### keine Adresse = alles x='abc\nbcd\ncde\ndef\nefg\nfhi\n' echo -en "$x" | sed -n '1,/e/' ### Bereich: Z1 bis zur ersten ### Zeile auf die die Regexp 'e' ### passt echo -en "$x" | sed -n '1,/^e/' ### Bereich: dito, andere Regexp echo -en "$x" | sed -n '/^b/,/e/p' ### Bereich: erste Zeile auf die '^b' ### passt bis erste Z. auf die ### 'e' passt echo -en "$x" | sed -n '/^b/,/^e/p' ### dito, andere End-Regexp echo -en "$x" | sed -n '/[bf]/p' ### Bereich: alle Zeilen auf die ### die RE passt So, jetzt wissen wir also, wie man mittels Adressen den folgenden Befehl aus bestimmte Bereiche der Eingabe einschraenkt. Allerdings nehmen einige sed-Befehle keine, oder nur eine Adresse (also nur 'BEGINN'). Darunter auch 'a'. Die meisten sind aber "Commands which accept address ranges", so z.B. 'p' und 's///'. echo -en "$x" | sed '/f/s/e/X/' ### Bereich: Zeilen auf die die ### Regexp 'f' passt, Befehl: ### substituiere das jew. erste ### 'e' der Zeile durch ein 'X'. Weitere Details zu 's///' wie die Modifizierer 'g' und 'p' finden sich in der manpage von sed.
a\text #Hier sage ich sed, er soll text anhängen
Aber an was? Les mal die manpage genau(er) unter Beruecksichtigung des obigen und der Ueberschrift "Zero- or One- address commands". ==== a \ text Append text, which has each embedded newline pre ceeded by a backslash. ==== Der sed-Befehl 'a' nimmt also 'keine' oder 'eine' Adresse. Und haengt _dort_ "text" an. echo -en "$x" | sed '/ef/a\
XXX' ### haenge _nach_ Zeilen auf die die ### Regexp 'ef' passt, den Text 'XXX' ### an.
Wichtig: das '\<newline>' gehoert zur Syntax von 'a'.[1] Den Unterschied von 'a' (fuer "append" ~ "anhaengen") zu 'i\ text' ("insert" ~ "einfuegen") sowie 'c\ text' ("change" ~ "aendern") kann man z.B. so einfach herausfinden (in $x steht immer noch das 'abc\nbcd...'): echo -en "$x" | sed '$a\ XXX' echo -en "$x" | sed '$i\ XXX' echo -en "$x" | sed '$c\ XXX'
sed -e /muster/a\text datei1 > datei2 Die shell meldet: sed: -e expression #1, char 8: Extra characters after command
Dein sed hat dieses[1] Feature offenbar nicht, dort gilt wie allgemein, dass nach so einem '\' _kein_ weiteres Zeichen ausser dem Zeilenumbruch folgen darf. Andernfalls wird es (AFAIK) ignoriert und sed beschwert sich dann zurecht ueber das 'atext', was keine gueltige Syntax ist. Korrekt waere also: sed -e '/muster/a\ text' datei1 > datei2 Den Zeilenumbruch gibt man in scripten einfach ein, auf der Kommandozeile laesst man einfach das schliessende "'" solange weg... Aber du willst ja an das _Zeilenende_ anfuegen, wie das geht siehe ganz oben. (Achtung: dort taucht das '$' als PATTERN im 's/PATTERN/REPLACEMENT/[MODIFIER]'-Befehl auf und steht _nicht_ fuer die letzte Zeile wie in einer Adresse, sondern wie in einer Adress-_Regexp_ fuer das Ende einer einzelnen Zeile! echo -e 'fubar\nfoo\nbar\nfoo\nbaz' \ | sed '/^bar$/,$s/o$/x/' ### | | ^- Zeilenende, da in Regexp ### | `- letzte Zeile ### `- Zeilenende, da in Regexp
Vielleicht hat auch einfach einer ne URL von einer brauchbaren Beispielseite. Beispiele wie "$a\ Fügt text an letzte Zeile an .....blablablub" nützen halt überhaupt nix, wenn man den Befehl in seiner kompletten syntax nicht hinbekommt.
manpage sehr genau lesen und ausprobieren! Und such mal nach Mails von mir hier in der Liste wo sed drin vorkommt... Ich hab hier (erst neulich) ausfuehrlich was geschrieben. -dnh [1] dass dort bei neueren GNU-sed (oder SuSE-GNU-sed) offenbar das newline fehlen darf ist mir neu. Portabel ist das aber sicher nicht, also ist es zu vermeiden. -- "And the Baron's tendency to speak in rhyme is even worse. It's like the Atreides are engaged in a brutal blood feud with Dr. Seuss." --Dave Helm on the Dune miniserie
* David Haller schrieb am 01.Aug.2003:
x='abc\nbcd\ncde\ndef\nefg\nfhi\n'
echo -en "$x" | sed -n '1,/e/' ### Bereich: Z1 bis zur ersten ### Zeile auf die die Regexp 'e' ### passt echo -en "$x" | sed -n '1,/^e/' ### Bereich: dito, andere Regexp
Und was ist damit? Du hast den Befehl vergessen, Du meinst wohl: echo -en "$x" | sed -n '1,/e/p' bzw. echo -en "$x" | sed -n '1,/^e/p' Bernd -- Alle meine Signaturen sind rein zufällig und haben nichts mit dem Text oder dem Schreiber zu tun, dem ich antworte. Falls irgendwelche Unrichtigkeiten dabei sein sollten, so bedauere ich das. Es wäre nett, wenn Du mich benachrichtigen würdest. |Zufallssignatur 0
Hallo, On Fri, 01 Aug 2003, Bernd Brodesser schrieb:
* David Haller schrieb am 01.Aug.2003:
x='abc\nbcd\ncde\ndef\nefg\nfhi\n'
echo -en "$x" | sed -n '1,/e/' ### Bereich: Z1 bis zur ersten ### Zeile auf die die Regexp 'e' ### passt echo -en "$x" | sed -n '1,/^e/' ### Bereich: dito, andere Regexp
Und was ist damit? Du hast den Befehl vergessen, Du meinst wohl:
echo -en "$x" | sed -n '1,/e/p' bzw. echo -en "$x" | sed -n '1,/^e/p'
Ups. Ja. -dnh -- program (pro'-gram) [n] A magic spell cast over a computer allowing it to turn one's input into error messages. tr.v. To engage in a pastime similar to banging one's head against a wall, but with fewer opportunities for reward.
Moin Bernd... ich antworte mal wieder mit: Nimm perl ;-)
Mein Befehl: sed -e /muster/a\text datei1 > datei2
Da gehts mit: perl -pe '/muster/ && s/$/text/;' datei1 > datei2 oder auch: perl -pe '$_.="text" if /muster/;' datei1 > datei2 was Dir halt besser gefällt. -- COMPUTERBILD 15/03: Premium-e-mail-Dienste im Test -------------------------------------------------- 1. GMX TopMail - Platz 1 und Testsieger! 2. GMX ProMail - Platz 2 und Preis-Qualitätssieger! 3. Arcor - 4. web.de - 5. T-Online - 6. freenet.de - 7. daybyday - 8. e-Post
participants (12)
-
B.Brodesser@t-online.de
-
Bernd Tannenbaum
-
David Haller
-
hape zerres
-
Jürgen Vollmer
-
Martin Wilck
-
Michael Schulz
-
Oliver Fuchs
-
Ralf Corsepius
-
Stephan Hradek
-
SuSE
-
Wolfgang Hinsch