Page 1 of 1
ed oder sed?
Posted: 2007-07-30 11:15
by tomotom
Warum führt folgendes script nicht zum gewünschten Erfolg?
Es sollten ja alle
a in x ersetztwerden. Es wir nicht ersetzt.
Code: Select all
#!/bin/bash
echo '
1,$s/a/x/g
wq
' | ed test
Die Konsolenmeldung sieht so aus:
serve1:/home# ./test-ed.sh test
18
?
?
?
?
Genauso geht es nicht wenn ich ed ohne pipe verwende. In test.txt wird nichts ersetzt:
Code: Select all
server:/home# ed test s/a/x/g
18
w
18
q
Re: ed oder sed?
Posted: 2007-07-30 12:32
by tomotom
matzewe01 wrote:Bei Vi muss ich z.b. angeban von wo bis wo die Ersetzung statt finden soll.
1,$ s/a/x/g
ob das bei ed auch so ist?
Gruss Matthias
Geht mit der Zeilenangabe auch nicht. Wie setze ich denn den vi im shellscript ein bzw. wie in diesem Beipspiel?
Re: ed oder sed?
Posted: 2007-07-30 12:58
by Joe User
Code: Select all
echo '
,s/a/x/g
,wq
' | ed file.txt
Re: ed oder sed?
Posted: 2007-07-30 13:28
by tomotom
Joe User wrote:Code: Select all
echo '
,s/a/x/g
,wq
' | ed file.txt
Das geht.
Aber warum werden nach wie Fragezeichen nach der Ausführung angezeigt? Das deutet doch auf einen Fehler.
Code: Select all
server:/home# ./test-ed.sh
18
?
?
18
Weiß jemand wie man das mit vi machen würde?
Re: ed oder sed?
Posted: 2007-07-30 13:41
by tomotom
matzewe01 wrote:...
Warum muss das eigentlich partu mit einem "editor" ala ed oder vi gemacht werden? sed ist meiner Meinung nach genau das richtige Tool um Dinge in Scripten zu manipulieren.
Und wie sieht dann Dein Vorschalg mit sed aus? (Ich bin gespannt und lerne gerne :-) )
Warum hast Du etwas gegen editoren in scripten?
Re: ed oder sed?
Posted: 2007-07-30 13:55
by tomotom
matzewe01 wrote:
natürlich geht es auch so:
Code: Select all
echo "a b c d e f" | sed "s/a/x/g"
Wunderbar, aber dann ist ja die Datei noch nicht geändert. Wie schreibe ich denn die Änderungen in die Datei, nachdem sie sed geändert hat? (Editoren machen das, deshalb habe ich es mit editoren versucht.)
Re: ed oder sed?
Posted: 2007-07-30 14:00
by Joe User
BTW: Auch sed ist ein Editor ;)
Re: ed oder sed?
Posted: 2007-07-30 14:09
by tomotom
Joe User wrote:
BTW: Auch sed ist ein Editor ;)
Is ja geil :-D
Jetzt gebe ich ed auf!
Re: ed oder sed?
Posted: 2007-07-30 15:34
by tomotom
matzewe01 wrote:... stream Editor ...
ja, ja ...
Kann grep auch strings beschneiden muss man dafür grep verwenden?
Diese Zeile schneidet alles ab dem"/" ab.
Re: ed oder sed?
Posted: 2007-07-30 16:04
by tomotom
matzewe01 wrote:tomotom wrote:
Kann grep auch strings beschneiden muss man dafür grep verwenden?
Nein muss man nicht, das geht auch mit sed.
Gruss Matthias
Hast Du evt. ein Beispiel?
Re: ed oder sed?
Posted: 2007-07-30 16:10
by Joe User
Re: ed oder sed?
Posted: 2007-07-30 16:25
by tomotom
Wunderbar! Das hier ist auch sehr gut:
http://sed.sourceforge.net/sed1line_de.html
Nur habe bei meiner bisherigen Suche noch kein Beispiel zum Beschneiden von srings gefunden.
Hat jemand evt. etwas vergleichbaren zu meinem obigen grep Beispiel, das einen string abschneidet?
Re: ed oder sed?
Posted: 2007-07-30 16:49
by tomotom
matzewe01 wrote:
Wäre kein Fehler nicht.
Worauf bezieht sich das nicht?
:-)
Danke für die guten Links.
Hier ist die exakte Antwort auf meine Frage:
Code: Select all
echo '/usr/bin/ls'|sed 's/[^/]*$//'
Re: ed oder sed?
Posted: 2007-07-31 13:36
by tomotom
sed erstzt ja vieles wunderbar. Dies geschied jedoch nie auf Zeilen sondern immer auf Zeichenebene per regex.
Wie kann ich mit sed ganz einfach eine ganze Zeile die einen bestimmten Ausdruck enthält ersetzen?
Ich habe folgende Ausdrücke ohne Erfolg probiert, um die Zeile zu finden in der x vorkommt und diese dann als ganzes zu ersetzen. Ersetzt wird aber immer nur das x und nicht die ganze Zeile.
sed -e '/^x*r/s//mmm = &/ # Soll nach dem Zeilenupbruch suchen als letztes Zeichen
sed -e '/^x*/s//mmm = &/ # Soll die gesamte Zeile die mit x beginnt nehmen
Code: Select all
sed -e '/x*r/s//mmm = &/' -i test|cat test
test.txt
Re: ed oder sed?
Posted: 2007-07-31 13:49
by suntzu
Code: Select all
sed -e '/^x/c"hallo welt"' -i test.txt
Sucht nach allen Zeilen, die mit x beginnen und ersetzt sie durch "hallo welt"
Re: ed oder sed?
Posted: 2007-07-31 13:55
by Joe User
Re: ed oder sed?
Posted: 2007-07-31 13:56
by tomotom
SunTzu wrote:Code: Select all
sed -e '/^x/c"hallo welt"' -i test.txt
Sucht nach allen Zeilen, die mit x beginnen und ersetzt sie durch "hallo welt"
Super, danke.
Kannst Du mir noch die Regel erklären? Ich verstehe nicht warum es geht?
Ich ersetzen geht doch sonst mit s/RE/Neu/. Es fehlt die ganze
s/ Syntax. Dafür gibt es
/cNeu [/b Ich hatte mich irgentwie an s/... festgebissen ...
[edit]Es scheit, wohl das hier aus der man page von sed zu sein:
c
text Replace the selected lines with text, which has each embedded newline preceded by a backslash.
Re: ed oder sed?
Posted: 2007-07-31 14:11
by tomotom
Wenn ich nun möchte das das Gesuche und Ersetzen nach der ersten gefundenen Stelle stoppt ist es richtig, dass ich folgendes an den Anfang setze?
sed -e '0,/^x/c"hallo welt"' -i test.txt
Re: ed oder sed?
Posted: 2007-07-31 14:17
by suntzu
Bist du zu faul auszuprobieren!? Also ein wenig Eigeninitiative wird ja wohl zu erwarten sein - dann würdest du nämlich schnell feststellen, dass das nicht richtig ist.
Re: ed oder sed?
Posted: 2007-07-31 14:29
by tomotom
SunTzu wrote:Bist du zu faul auszuprobieren!? Also ein wenig Eigeninitiative wird ja wohl zu erwarten sein - dann würdest du nämlich schnell feststellen, dass das nicht richtig ist.
Ich dachte zu erst es geht, doch dann musste ich sehen, dass damit immer von oben weg immer eine Zeile gelöscht wird. :(
sed -e '0,/^h/c xxx' -i test
Wie geht es dass die Suche nach dem ersten Treffer beendet wird?
Re: ed oder sed?
Posted: 2007-07-31 14:42
by tomotom
So geht es mit dem Vorschlag von Joe User:
Code: Select all
sed -e '0,/^.*m.*$/s//aaaa/' -i test
Wie geht es mit dem, dass bei dem ersten Treffen gestoppt wird?
Re: ed oder sed?
Posted: 2007-07-31 14:54
by Joe User
Alle Matches ersetzen:
Nur den ersten Match eretzen:
Das Geheimnis steckt im g, siehe sed Doku...
Re: ed oder sed?
Posted: 2007-07-31 15:16
by tomotom
Joe User wrote:Alle Matches ersetzen:
Nur den ersten Match eretzen:
Das Geheimnis steckt im g, siehe sed Doku...
Ja, "g" steht für alle Treffer, aber bezieht sich auf eine Zeile.
Ich möchte aber, dass die gesammte Suche nach dem ersten gefundenen Treffer gestoppt wird und das geht nicht wenn man einfach nur "g" wegläßt. Denn
würde in
allen Zeilen den ersten Treffer ersetzen.
Um nach dem ersten Treffen die Suche zu beenden muss man die Adressierung von "0," vor dem /RE/ verwenden.
Ich weiß allerdings immer noch nicht warum diese Adressierung nicht bei folgendem Beipiel hinhaut.