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

Code: Select all

#test.txt
a
b
a
b
a
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:

Code: Select all

sed "s/a/x/g" datei
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

Code: Select all

sed 's/a/x/g' -i file.txt
BTW: Auch sed ist ein Editor ;)

Re: ed oder sed?

Posted: 2007-07-30 14:09
by tomotom
Joe User wrote:

Code: Select all

sed 's/a/x/g' -i file.txt
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.

Code: Select all

grep -o ${Schalter%/*}

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

Code: Select all

abc
xyz
sdv

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

Code: Select all

sed 's/^.*x.*$/mmm/g'

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?

Code: Select all

sed -e '/^m/c aaaa' -i test

Re: ed oder sed?

Posted: 2007-07-31 14:54
by Joe User
Alle Matches ersetzen:

Code: Select all

sed 's/match/replace/g'
Nur den ersten Match eretzen:

Code: Select all

sed 's/match/replace/'
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:

Code: Select all

sed 's/match/replace/g'
Nur den ersten Match eretzen:

Code: Select all

sed 's/match/replace/'
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

Code: Select all

sed 's/match/replace/'
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.

Code: Select all

sed -e '/^match/creplace'