ed oder sed?

Bash, Shell, PHP, Python, Perl, CGI
tomotom
Posts: 330
Joined: 2006-09-22 13:37

ed oder sed?

Post by tomotom » 2007-07-30 11:15

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
Last edited by tomotom on 2007-07-31 13:29, edited 1 time in total.

tomotom
Posts: 330
Joined: 2006-09-22 13:37

Re: ed oder sed?

Post by tomotom » 2007-07-30 12:32

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?

User avatar
Joe User
Project Manager
Project Manager
Posts: 11138
Joined: 2003-02-27 01:00
Location: Hamburg

Re: ed oder sed?

Post by Joe User » 2007-07-30 12:58

Code: Select all

echo '
,s/a/x/g
,wq
' | ed file.txt

tomotom
Posts: 330
Joined: 2006-09-22 13:37

Re: ed oder sed?

Post by tomotom » 2007-07-30 13:28

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?

tomotom
Posts: 330
Joined: 2006-09-22 13:37

Re: ed oder sed?

Post by tomotom » 2007-07-30 13:41

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?

tomotom
Posts: 330
Joined: 2006-09-22 13:37

Re: ed oder sed?

Post by tomotom » 2007-07-30 13:55

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.)

User avatar
Joe User
Project Manager
Project Manager
Posts: 11138
Joined: 2003-02-27 01:00
Location: Hamburg

Re: ed oder sed?

Post by Joe User » 2007-07-30 14:00

Code: Select all

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

tomotom
Posts: 330
Joined: 2006-09-22 13:37

Re: ed oder sed?

Post by tomotom » 2007-07-30 14:09

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!

tomotom
Posts: 330
Joined: 2006-09-22 13:37

Re: ed oder sed?

Post by tomotom » 2007-07-30 15:34

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%/*}

tomotom
Posts: 330
Joined: 2006-09-22 13:37

Re: ed oder sed?

Post by tomotom » 2007-07-30 16:04

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?

User avatar
Joe User
Project Manager
Project Manager
Posts: 11138
Joined: 2003-02-27 01:00
Location: Hamburg

Re: ed oder sed?

Post by Joe User » 2007-07-30 16:10


tomotom
Posts: 330
Joined: 2006-09-22 13:37

Re: ed oder sed?

Post by tomotom » 2007-07-30 16:25

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?

tomotom
Posts: 330
Joined: 2006-09-22 13:37

Re: ed oder sed?

Post by tomotom » 2007-07-30 16:49

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/[^/]*$//'

tomotom
Posts: 330
Joined: 2006-09-22 13:37

Re: ed oder sed?

Post by tomotom » 2007-07-31 13:36

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

suntzu
Posts: 669
Joined: 2002-12-20 19:47
Location: Mönchengladbach

Re: ed oder sed?

Post by suntzu » 2007-07-31 13:49

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"

User avatar
Joe User
Project Manager
Project Manager
Posts: 11138
Joined: 2003-02-27 01:00
Location: Hamburg

Re: ed oder sed?

Post by Joe User » 2007-07-31 13:55

Code: Select all

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

tomotom
Posts: 330
Joined: 2006-09-22 13:37

Re: ed oder sed?

Post by tomotom » 2007-07-31 13:56

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.

tomotom
Posts: 330
Joined: 2006-09-22 13:37

Re: ed oder sed?

Post by tomotom » 2007-07-31 14:11

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

suntzu
Posts: 669
Joined: 2002-12-20 19:47
Location: Mönchengladbach

Re: ed oder sed?

Post by suntzu » 2007-07-31 14:17

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.

tomotom
Posts: 330
Joined: 2006-09-22 13:37

Re: ed oder sed?

Post by tomotom » 2007-07-31 14:29

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?

tomotom
Posts: 330
Joined: 2006-09-22 13:37

Re: ed oder sed?

Post by tomotom » 2007-07-31 14:42

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

User avatar
Joe User
Project Manager
Project Manager
Posts: 11138
Joined: 2003-02-27 01:00
Location: Hamburg

Re: ed oder sed?

Post by Joe User » 2007-07-31 14:54

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...

tomotom
Posts: 330
Joined: 2006-09-22 13:37

Re: ed oder sed?

Post by tomotom » 2007-07-31 15:16

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'