hilfe bei sed

T

todd#6

Jungspund
Erstellen Sie ein Sed Skript das in einer Textdatei in allen Wörtern, die mit einem großen G beginnen und den String „zwerg“ enthalten, das große G durch ein kleines g ersetzt sowie den String „zwerg“ verdoppeln.
Beachten Sie: Wörter werden daran erkannt, dass unmittelbar vor und nach dem Wort kein Buchstabe und keine Ziffer steht.
Beispiel: Aus dem Wort „Gartenzwerg“ soll „gartenzwergzwerg“

das ist die datei in dem das sed script suchen soll:
Gartenzwerg
Gzwerg
Hundezwerg
Gartenzwerga
Gzwerg1
Hundezwerg
1Gzwerg1

irgendwie klappt das bei mir nicht habe ersr das "G" durch das kleine ersetzt mit der y option

y/G.\{1,\}zwerg/g.\{1,\}zwerg/
s/g.\{1,\}zwerg/g.\{1,\}zwergzwerg/

der output sieht wie folgt aus:

g.{1,}zwergzwerg
gzwerg
Hundezwerg
g.{1,}zwergzwerga
gzwerg1
Hundezwerg
1gzwerg1

kann es mir leider nciht erklären. hat jemand ein tipp für mich was ich falsch machen
 
ein paar Punkte zur Hilfe:
1) in dem Ersatzteil, d.h., dem Teil innerhalb der zweiten '//', solltest Du nur '\1' benutzen, um Dich auf den entsprechenden Teil in der RegExp zu beziehen
2) Das Ersetzen von G durch g kannst Du auch gleich innerhalb von "s///" erledigen
3) Du hast nicht beachtet, was in der Augabenstellung mit "Beachten Sie" eingeleitet wird ;-)
 
s/[^A-F][^H-Z][^a-f][^h-z][^0-9]G.\1zwerg[^A-Z][^a-z][^0-9]/g.\1zwergzwerg/

ich kann leider meinen fehler nicht finden. könnte mir jemand vll nochmal einen tipp geben?
 
verstehe es einfach nicht.

das egal was ich eingebe mein kompletter input ausgegeben wird. obwohl ich alles verneine.

könnte mir einer ein beispiel sytax hier posten wie man sich eine zeichenkette merken kann.
 
Hi,

um dir eine Zeichenkette zu "merken", musst du sie im Suchstring mit \( und \) einfassen; dann kannst du darauf im Ersetzungstext mit \1, \2, ... zugreifen, also etwa
Code:
$ echo abc | sed -e 's/\(a\)\(.*\)\(c\)/\3\2\2\1/'
cbba
$

A.
 
das mit dem string merken geht wunderbar.
s/^G\.*\(zwerg\)/g.*\1\1/
aber warum klappt .* nicht
.= 1beliebiges Zeichen
*=0-unendlich wiederholungen
 
habe es glaubig

s/^G\(.*\)\(zwerg\)$/g\1\2\2/

eigentlich ganz einfach wenn man das schonmal ein paar mal hätte machen müssen
 
Zuletzt bearbeitet:
Das funktioniert auf jeden Fall schon mal teilweise - aber nur einmal pro Zeile (also noch nicht für jedes Wort), und nur, wenn das G am Zeilenanfang und der zwerg am Ende stehen ...
 
tipp`??
wie macht man so was?

g (global) alle auf den Ausdruck passenden Textteile werden
ersetzt
Macht man das vll so?

s/\bG\(.*\)\(zwerg\)\b/g\1\2\2/g

habe die input datei erweitert mehrer wörter stehen nun in einer zeile.
Gartenzwerg hund katze Gartenzwerg
Gzwerg hund katze Gartenzwerg
Hundezwerg hund katze Gartenzwerg
Gartenzwerga hund katze Gartenzwerg
Gzwerg1 hund katze Gartenzwerg
Hundezwerg hund katze Gartenzwerg
1Gzwerg1 hund katze Gartenzwerg

der output sieht sehr komisch aus

gartenzwerg hund katze Gartenzwergzwerg
gzwerg hund katze Gartenzwergzwerg
Hundezwerg hund katze gartenzwergzwerg
gartenzwerga hund katze Gartenzwergzwerg
gzwerg1 hund katze Gartenzwergzwerg
Hundezwerg hund katze gartenzwergzwerg
1Gzwerg1 hund katze gartenzwergzwerg

irgedwie macht sed ein mischmasch daraus
 
Zuletzt bearbeitet:

Ähnliche Themen

Skript bei Lubuntu nach jedem Start ausführen

ersetzen in einem Rückgabestring eines vorher ausgeführten Programms

Linux in a Nutshell

Server-Monitoring mit RRDTool

Samba als PDC [Short-HOWTO]

Zurück
Oben