Liebe Gemeinde, wie bekomme ich sed dazu, eine Substitution/Manipulation direkt an einer Datei vorzunehmen, an Stelle es auf die Kommandozeile zu schreiben: sed s/applet/bpplet/ tabtest.html ersetzt zwar "applet" durch "bpplet" aber leider nicht in der Datei. Olaf -- metaGen pharmaceuticals GmbH Oudenarder Strasse 16 D-13347 Berlin Germany phone +49-30-45082321 fax +49-30-45082101
Am Mon, 19 Nov 2001 schrieb Olaf Lange:
wie bekomme ich sed dazu, eine Substitution/Manipulation direkt an einer Datei vorzunehmen, an Stelle es auf die Kommandozeile zu schreiben:
sed s/applet/bpplet/ tabtest.html
Sed liest von STDIN und schreibt auf STDOUT, wenn Du das nicht willst, mußt Du entsprechende Umleitungen definieren. Aber Achtung, Du darfst nicht die gleiche Datei über Stdin einspeisen und als Umleitung von Stdout angeben. sed s/applet/bpplet/ < tabtest.html > tabtest.hmtl ist eine sichere Methode, die Datei tabtest.html zu leeren... Also stattdessen z.B.: sed s/applet/bpplet/ < tabtest.html > tabtest.html.tmp mv tabtest.html.tmp tabtest.html Wenn Du das für viele Dateien (z.B. alle in einem Verzeichnis) machen willst, bietet sich ein Miniskript an: for i in *; do sed -e "s/applet/bpplet/" < $i > $i.tmp; \ mv $i.tmp $i; done \ soll andeuten, daß da eigentlich kein Zeilenumbruch steht! Vorher aber checken ob alles so funktioniert, wie Du es Dir denkst. Gruß Christoph -- Christoph Maurer - Paul-Röntgen-Straße 7 - 52072 Aachen - Tux#194235 mailto:christoph-maurer@gmx.de - http://www.christophmaurer.de Auf der Homepage u.a.: Installation von SuSE 7.0 auf Notebook Acer Travelmate 508 T, Elektrotechnik an der RWTH Aachen
* Christoph Maurer schrieb am 19.Nov.2001:
for i in *; do sed -e "s/applet/bpplet/" < $i > $i.tmp; \ mv $i.tmp $i; done
\ soll andeuten, daß da eigentlich kein Zeilenumbruch steht!
Vorher aber checken ob alles so funktioniert, wie Du es Dir denkst.
Nö muß nicht in einer Zeile stehen. Ist auch kein Skript für nötig. Kann man alles so eingaben wie es da steht. Sieht etwa so aus: $ for i in *
do sed -e "s/applet/bpplet/" < $i > $i.tmp && mv $i.tmp $i done $
Dabei steht $ für den normalen PS1 Prompt, der die bash ausgibt und > für den PS2 Prompt, der die Shell ausgibt, wenn ein Befehl noch nicht vollständig ist. && deshalb, weil dann der mv-Befehl nur dann ausgeführt wird, wenn vorher der sed-Befehl keinen Fehler meldet. Wenn man es wirklich in einem Skript schreibt, dann dürfen da natürlich keine $ und > am Anfang der Zeile stehen. Das ist nur der Prompt und nichts was man eingibt. Bernd -- ACK = ACKnowledge = Zustimmung | NAC = No ACknowledge = keine Zustimmung DAU = Dümmster Anzunehmender User | LOL = Laughing Out Loud = Lautes Lachen IIRC = If I Remember Correctly = Falls ich mich richtig erinnere OT = Off Topic = Am Thema (der Liste) vorbei |Zufallssignatur 11
Am Mon, 2001-11-19 um 16.41 schrieb Bernd Brodesser:
* Christoph Maurer schrieb am 19.Nov.2001:
for i in *; do sed -e "s/applet/bpplet/" < $i > $i.tmp; \ mv $i.tmp $i; done
\ soll andeuten, daß da eigentlich kein Zeilenumbruch steht!
Vorher aber checken ob alles so funktioniert, wie Du es Dir denkst.
Nö muß nicht in einer Zeile stehen. Doch.
Ist auch kein Skript für nötig. Kann man alles so eingaben wie es da steht. Sieht etwa so aus:
$ for i in *
do sed -e "s/applet/bpplet/" < $i > $i.tmp && mv $i.tmp $i done $
Dabei steht $ für den normalen PS1 Prompt, der die bash ausgibt und > für den PS2 Prompt, der die Shell ausgibt, wenn ein Befehl noch nicht vollständig ist. Womit das ganze eine Zeile ist :)
Ralf
* Ralf Corsepius schrieb am 19.Nov.2001:
Am Mon, 2001-11-19 um 16.41 schrieb Bernd Brodesser:
* Christoph Maurer schrieb am 19.Nov.2001:
for i in *; do sed -e "s/applet/bpplet/" < $i > $i.tmp; \ mv $i.tmp $i; done
\ soll andeuten, daß da eigentlich kein Zeilenumbruch steht!
Vorher aber checken ob alles so funktioniert, wie Du es Dir denkst.
Nö muß nicht in einer Zeile stehen. Doch.
Ist auch kein Skript für nötig. Kann man alles so eingaben wie es da steht. Sieht etwa so aus:
$ for i in *
do sed -e "s/applet/bpplet/" < $i > $i.tmp && mv $i.tmp $i done $
Dabei steht $ für den normalen PS1 Prompt, der die bash ausgibt und > für den PS2 Prompt, der die Shell ausgibt, wenn ein Befehl noch nicht vollständig ist. Womit das ganze eine Zeile ist :)
Sollen wir jetzt darüber diskutieren, was eine Zeile ist? Wenn man ein Skript schreibt, braucht man es doch nicht in einer Zeile zu schreiben. Und wenn man es interaktiv eingibt, dann kann man durchaus die Returntaste zwichendurch betätigen. Dann braucht man kein ; einzugeben und auch kein \ Natürlich nicht an beliebiger Stelle, sondern nur dort wo ein Teilbefehl zu Ende ist. Bernd -- Welches Buch ist zu empfehlen? Schon mal bei SuSE vorbeigesehen? http://www.suse.de/de/produkte/buecher/index.html oder die Empfehlungen der SuSE-Entwickler auf dem eigenen Rechner? file:///usr/shar/doc/sdb/de/html/literatur.html |Zufallssignatur 5
Am Mon, 19 Nov 2001 schrieb Bernd Brodesser:
* Ralf Corsepius schrieb am 19.Nov.2001:
Am Mon, 2001-11-19 um 16.41 schrieb Bernd Brodesser:
* Christoph Maurer schrieb am 19.Nov.2001:
for i in *; do sed -e "s/applet/bpplet/" < $i > $i.tmp; \ mv $i.tmp $i; done
\ soll andeuten, daß da eigentlich kein Zeilenumbruch steht!
Vorher aber checken ob alles so funktioniert, wie Du es Dir denkst.
Nö muß nicht in einer Zeile stehen. Doch.
Ist auch kein Skript für nötig. Kann man alles so eingaben wie es da steht. Sieht etwa so aus:
$ for i in *
do sed -e "s/applet/bpplet/" < $i > $i.tmp && mv $i.tmp $i done $
Dabei steht $ für den normalen PS1 Prompt, der die bash ausgibt und > für den PS2 Prompt, der die Shell ausgibt, wenn ein Befehl noch nicht vollständig ist. Womit das ganze eine Zeile ist :)
Sollen wir jetzt darüber diskutieren, was eine Zeile ist?
Wir können ja eine Unterscheidung zwischen syntaktischer und Eingabezeile einführen ;-)
Wenn man ein Skript schreibt, braucht man es doch nicht in einer Zeile zu schreiben. Und wenn man es interaktiv eingibt, dann kann man durchaus die Returntaste zwichendurch betätigen. Dann braucht man kein ; einzugeben und auch kein \ Natürlich nicht an beliebiger Stelle, sondern nur dort wo ein Teilbefehl zu Ende ist.
Im täglichen Betrieb mache ich das auch exakt so, war mir für die Mail aber zu kompliziert zu erklären gewesen... Wichtig war aber der Hinweis, die sed und die mv-Operation mit && zu verknüpfen, das ist in der Diskussion jetzt zu Unrecht etwas untergegangen. Gruß Christoph -- Christoph Maurer - Paul-Röntgen-Straße 7 - 52072 Aachen - Tux#194235 mailto:christoph-maurer@gmx.de - http://www.christophmaurer.de Auf der Homepage u.a.: Installation von SuSE 7.0 auf Notebook Acer Travelmate 508 T, Elektrotechnik an der RWTH Aachen
Christoph Maurer wrote:
Am Mon, 19 Nov 2001 schrieb Olaf Lange:
wie bekomme ich sed dazu, eine Substitution/Manipulation direkt an einer Datei vorzunehmen, an Stelle es auf die Kommandozeile zu schreiben:
sed s/applet/bpplet/ tabtest.html
Aber Achtung, Du darfst nicht die gleiche Datei über Stdin einspeisen und als Umleitung von Stdout angeben.
sed s/applet/bpplet/ < tabtest.html > tabtest.hmtl ist eine sichere Methode, die Datei tabtest.html zu leeren...
Bei mir hat cat datei | sed -e /pattern1/pattern2/ > datei immer geklappt und es war auch nachher alls ersetzt und die Datei nicht wech.... Rene
* Rene Engelhard schrieb am 19.Nov.2001:
Bei mir hat
cat datei | sed -e /pattern1/pattern2/ > datei
immer geklappt und es war auch nachher alls ersetzt und die Datei nicht wech....
Wie groß war denn die Datei? Bei kleinen Dateien funktioniert das, bei großen stehen anschließend genau 4096 Zeichen dort. Das dürfte die Anzahl Zeichen sein, die in einer Pipe passen. Bernd -- Homepages von deutschsprachigen Linux-Gurus: Kristian Köhntopp: http://www.koehntopp.de/kris/artikel/ Sven Guckes: http://www.math.fu-berlin.de/~guckes/sven Robin S Socha: http://socha.net/index2.html |Zufallssignatur 10
On Mon, 19 Nov 2001, Bernd Brodesser wrote:
* Rene Engelhard schrieb am 19.Nov.2001:
Bei mir hat
cat datei | sed -e /pattern1/pattern2/ > datei
immer geklappt und es war auch nachher alls ersetzt und die Datei nicht wech....
Wie groß war denn die Datei? Bei kleinen Dateien funktioniert das, bei großen stehen anschließend genau 4096 Zeichen dort. Das dürfte die Anzahl Zeichen sein, die in einer Pipe passen.
Korrekt. Nur sind die pipes konfigurierbar gross. Siehe 'help ulimit' und 'ulimit -p': $ ulimit -p 8 $ ulimit -a | grep pipe pipe size (512 bytes) 8 $ grep -c 'x' test.gz 19333 $ ls -l test.gz; cat test.gz | sed 's/u/x/' > test.gz ; ls -l test.gz -rw-r--r-- 1 dh dh 10924157 Nov 20 04:27 test.gz -rw-r--r-- 1 dh dh 4096 Nov 20 04:28 test.gz Teils bekomme ich aber auch 8kb statt 4kb... *UUUUPPS* :) -dnh -- Scahde! Schade1 jetzt wüsstest du sicher gern wie es weitergeht ja? Aber Ich denke man sollte sich einfach drin wohlfühlen. dag° Weil ich es mir Wert bin. [WoKo in dag°]
* David Haller schrieb am 20.Nov.2001: [pipegröße]
Korrekt. Nur sind die pipes konfigurierbar gross. Siehe 'help ulimit' und 'ulimit -p':
Der Befehl dazu war mir nicht geläufig, aber ich hoffe, jetzt fängt keiner an, an diese Größe zu drehen. Das bringt es ja wohl nicht.
$ ulimit -p 8 $ ulimit -a | grep pipe pipe size (512 bytes) 8
8 * 512 = 4096
$ grep -c 'x' test.gz 19333 $ ls -l test.gz; cat test.gz | sed 's/u/x/' > test.gz ; ls -l test.gz -rw-r--r-- 1 dh dh 10924157 Nov 20 04:27 test.gz -rw-r--r-- 1 dh dh 4096 Nov 20 04:28 test.gz ^^^^^ Interessante Zeit. Soetwas habe ich mir fast gedacht. ;)
Teils bekomme ich aber auch 8kb statt 4kb...
cat ist schneller als sed. Wenn cat, nachdem sed den ersten Block vollständig aus der Pipe geholt hat, schon den zweiten vollständig in die Pipe geschaufelt hat, bevor sed in die Datei geschriben hat, dann könnte es klappen. Schätze mal, das > auch 4096 Byte-Weise schaufelt. 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
On Tue, 20 Nov 2001, Bernd Brodesser wrote:
* David Haller schrieb am 20.Nov.2001: [pipegröße]
Korrekt. Nur sind die pipes konfigurierbar gross. Siehe 'help ulimit' und 'ulimit -p':
Der Befehl dazu war mir nicht geläufig, aber ich hoffe, jetzt fängt keiner an, an diese Größe zu drehen. Das bringt es ja wohl nicht.
ACK! Generell sollte man nur an den ulimits drehen, wenn man genau weiss was man tut und was die Aenderung macht.
$ ulimit -p 8 $ ulimit -a | grep pipe pipe size (512 bytes) 8
8 * 512 = 4096
Eben :)
$ ls -l test.gz; cat test.gz | sed 's/u/x/' > test.gz ; ls -l test.gz -rw-r--r-- 1 dh dh 10924157 Nov 20 04:27 test.gz -rw-r--r-- 1 dh dh 4096 Nov 20 04:28 test.gz ^^^^^ Interessante Zeit. Soetwas habe ich mir fast gedacht. ;)
*bg*
Teils bekomme ich aber auch 8kb statt 4kb...
cat ist schneller als sed. Wenn cat, nachdem sed den ersten Block vollständig aus der Pipe geholt hat, schon den zweiten vollständig in die Pipe geschaufelt hat, bevor sed in die Datei geschriben hat, dann könnte es klappen. Schätze mal, das > auch 4096 Byte-Weise schaufelt.
Sweet Almighty , do certifications grow on trees? Certifications grow in many unlikely places. Sometimes
Jep. Wuerde ich auch vermuten... -dnh -- they grow best in the dark and damp places --- like mildew. -- Rob Russell and Ron Ruble in asr
Hi, On Die, 20 Nov 2001, David Haller sent incredible lines:
On Tue, 20 Nov 2001, Bernd Brodesser wrote: [...]
cat ist schneller als sed. Wenn cat, nachdem sed den ersten Block vollständig aus der Pipe geholt hat, schon den zweiten vollständig in die Pipe geschaufelt hat, bevor sed in die Datei geschriben hat, dann könnte es klappen. Schätze mal, das > auch 4096 Byte-Weise schaufelt. Jep. Wuerde ich auch vermuten...
Sicher? Würde eine solche Umleitung nicht äquivalent zu einem FIFO funktionieren, also wenn 4096 erreicht blockiere Prozess 1 bis Prozess 2 Vollzug meldet? Ich bin mir da aber auch nicht sicher, wobei es mich wundern würde wenn man für äquivalente Konstrukte jedesmal zwei Prozesse mit anährend gleicher Laufzeit bräuchte. ... may the Tux be with you! =Thomas= -- Thomas Bendler \\:// ml@bendler-net.de Billwiese 22 (o -) http://www.bendler-net.de/ 21033 Hamburg ---ooO-(_)-Ooo--- tel.: 0 177 - 277 37 61 Germany Linux, enjoy the ride ...!
Bernd Brodesser wrote:
* Rene Engelhard schrieb am 19.Nov.2001:
Bei mir hat
cat datei | sed -e /pattern1/pattern2/ > datei
immer geklappt und es war auch nachher alls ersetzt und die Datei nicht wech....
Wie groß war denn die Datei? Bei kleinen Dateien funktioniert das, bei großen stehen anschließend genau 4096 Zeichen dort. Das dürfte die Anzahl Zeichen sein, die in einer Pipe passen.
Ich weiß leider nicht mehr wie groß, sind aber wahrscheinlich kleine gewesen. Dazugelernt. :-)) Rene
On Mon, 19 Nov 2001 14:17:57 +0100
Olaf Lange
Liebe Gemeinde,
wie bekomme ich sed dazu, eine Substitution/Manipulation direkt an einer Datei vorzunehmen, an Stelle es auf die Kommandozeile zu schreiben:
sed s/applet/bpplet/ tabtest.html Ausgabe einfach in eine neue Datei umleiten.
Gruß Lars
participants (8)
-
B.Brodesser@t-online.de
-
Christoph Maurer
-
David Haller
-
Lars Mucha
-
Olaf Lange
-
Ralf Corsepius
-
Rene Engelhard
-
Thomas Bendler