PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : hilfe zu verschiedenen ausdruecken


raptor666
17.01.2005, 12:13
hi all,

ich bin nicht sonderlich fitt mit regex daher die bitte um hilfe mit ein paar ausdruecken unter emacs.

1. in der emacs hilfe hab ich verzweifelt nach den ausdruecken \t \n \r gesucht (Tab, Newline, CarrierReturn), um z.b Tab durch Space zu ersetzen oder text zwischen *nix und dos zu konvertieren.
jemand nen tipp?

2. wie kann man einen suchbegriff ersetzen, wenn ein teil des suchbegriffs aber erhalten bleiben soll?
also zb. text = _123, _ soll durch xy_ ersetzt werden allerdings nur wenn es unmittelbar vor einer zahl steht (die ist natuerlich nicht immer gleich). wenn ich nach _[0-9] suche und dann ersetze wird natuerlich auch die erste ziffer ersetzt. wie kann ich das umgehen?

danke schonmal fuer eure hilfe

gr33tz


Jan Krüger
17.01.2005, 15:35
1. normalerweise eben einfach \t, \n und \r.
2. Hab ich nicht ganz verstanden. Einzelne Ziffern aus dem Original übernehmen kannst du, indem du sie im Match in Klammern () einschließt und dann mit Backreference (z.B. \1) beim Ersetzen wieder einfügst.

raptor666
17.01.2005, 18:06
1. normalerweise eben einfach \t, \n und \r.
nein, zumindest im emacs funktioniert das so nicht.
bei der normalen suche wird nach den zeichen '\n' gesucht, bei der suche mit regex wird das zeichen 'n' gesucht.
2. Hab ich nicht ganz verstanden. Einzelne Ziffern aus dem Original übernehmen kannst du, indem du sie im Match in Klammern () einschließt und dann mit Backreference (z.B. \1) beim Ersetzen wieder einfügst.
das hab ich jetzt nicht ganz verstanden :confused:
ich will zb: das zeichen '#' ueberall im text, wenn es vor irgendeiner zahl steht durch 'xy_' ersetzen, wie muesste dann der ausdruck aussehen?

sorry aber das peil ich nicht ganz.

butterkeks
17.01.2005, 18:55
1. Haste \\n probiert? Kenne emacs net, aber vlt. spielt emacs mit der Kommandozeile herum, bevor das ganze an die regex Engine weitergeleitet wird (ich nehme mal an, emacs hat eine Kommandozeile und du hast sie verwendet, da ich wie gesagt keine Ahnung von diesem Editor hab).

2.

s/#(\d+)/xy_$1/g

als Perl-Regex, zumindest.

Wie Jan sagte, musste warsch. \1 anstatt $1 verwenden. Mit \1 greifste auf den Inhalt der ersten Klammer zurück, mit \2 auf die zweite Klammer etc.

Ein gutes Tutorial zu Perl Regexen findeste hier:
http://seth.positivism.org/man.cgi/1/perlretut

Sollte eigentlich auch ohne viel Perl Kenntnisse verständlich sein

Jan Krüger
17.01.2005, 19:01
Achtung: POSIX-RegEx sind nicht so umfangreich wie Perl-REs. Was man aus dem Perl-Tutorial lernt, kann also manchmal frustrieren, weil GNU-Programme (wie Emacs) es dann eben oft nicht verstehen.

raptor666
17.01.2005, 20:04
1. Haste \\n probiert?
...
2.

s/#(\d+)/xy_$1/g

...

jepp \\n hab ich versucht, funzt leider auch nicht.

(\d+) funzt auch nicht weder in verbindung mit $1 noch mit \1

mir scheint ich muss das ganze doch mit sed oder aehnlichem machen und nicht im editor :(
wollte ich eigentlich vermeiden.

Jan Krüger
17.01.2005, 22:59
Klammern müssen im POSIX-Dialekt escaped werden: \(...\) -- außerdem gibt es \d nicht, man muss stattdessen z.B. [0-9] benutzen.

raptor666
18.01.2005, 07:13
Klammern müssen im POSIX-Dialekt escaped werden: \(...\) -- außerdem gibt es \d nicht, man muss stattdessen z.B. [0-9] benutzen.
:D :D :D _sieger_ :D :D :D

danke, jetzt klappts.

s/#\([0-9]\)/xyz_\1/gi

das es so grosse unterschiede bei den regex gibt hab ich auch nicht gewusst.
viele der regex links arbeiten mit \d und dergleichen.

fuer den posix-dialekt, wie du sags, ist warscheinlich der link auf sed aus dem link-thread am ehesten geeignet, oder hat jemand nen link der regex fuer den posix-dialekt besser beschreibt?

das problem mit \n \t \r hab ich allerdings immernoch, zumindest funzt das im emacs nicht :(

gr33tz

raptor666
19.01.2005, 13:26
ich werd noch wahnsinnig :mauer:

hab jetzt versucht das ganze nicht mit emacs sondern mit sed zu machen.
funzt auch soweit (auch \t \n \r) aber der versuch das zeichen ' im text durch \' zu ersetzen (also escapen) schlaegt fehl. der befehl wird nicht ausgefuehrt sondern es erscheint eine neue zeile:
>

und wartet scheinbar auf ne eingabe.

ich habs mit folgenden regex versucht (und noch ein paar mehr) aber es will ned.

sed 's/\'/\\'/g' textfile
sed 's/\'/\\\'/g' textfile

bei allem was ich durchstoebert habe muessen sonderzeichen escaped werden in einer regex. jemand ne idee was hier falsch ist, oder wie man's richtig macht?

gr33tz

Jan Krüger
19.01.2005, 15:00
In der Shell kannst du innerhalb von '' nichts escapen (man kann einfache Anführungszeichen innerhalb von einfachen Anführungszeichen nur so schreiben: 'abcde'"'"'fghij'). Es ist also besser, wenn du außenrum doppelte Anführungszeichen benutzt.
Übrigens sind einfach Anführungszeichen in RegEx keine Sonderzeichen, aber in der Shell sind sie welche (weil sie als Stringterminatoren interpretiert werden). Innerhalb von doppelten Anführungszeichen muss man einfache aber nicht escapen.

raptor666
19.01.2005, 16:33
In der Shell kannst du innerhalb von '' nichts escapen (man kann einfache Anführungszeichen innerhalb von einfachen Anführungszeichen nur so schreiben: 'abcde'"'"'fghij'). Es ist also besser, wenn du außenrum doppelte Anführungszeichen benutzt.
Übrigens sind einfach Anführungszeichen in RegEx keine Sonderzeichen, aber in der Shell sind sie welche (weil sie als Stringterminatoren interpretiert werden). Innerhalb von doppelten Anführungszeichen muss man einfache aber nicht escapen.

fuer den sed befehl brauche ich die einfachen anfuehrungszeichen doch, oder funktioniert auch :

sed "s/suche/ersetze/g" textfile ??

und was heisst das jetzt fuer meine fall?
welche der folgende schreibweisen ist dann zulaessig, oder beide, oder keine?

sed 's/"'"/\"'"/g' textfile oder sed "s/'/\'/g" textfile


sorry, aber ich schwimm grad ein wenig :(
gr33tz

butterkeks
19.01.2005, 18:08
Das obere und das untere rechte gehen so ohne weiteres. Das andere würde so gehen:

sed 's/'"'"'/\'"'"'/g'

Deine Frage ist etwas unglücklich gestellt...
sed an sich bracuht die Anführungszeichen nicht, sondern die sind für die Shell gedacht.
Wenn du keine Shell Sonderzeichen verwenest, brauchst du z.B. keine Anführungszeichen für sed und übrige Tools

raptor666
19.01.2005, 18:40
Das obere und das untere rechte gehen so ohne weiteres. Das andere würde so gehen:

sed 's/'"'"'/\'"'"'/g'
:D jezt wird's lustig :D

Deine Frage ist etwas unglücklich gestellt...
sed an sich bracuht die Anführungszeichen nicht, sondern die sind für die Shell gedacht.
Wenn du keine Shell Sonderzeichen verwenest, brauchst du z.B. keine Anführungszeichen für sed und übrige Tools
unter sonderzeichen verstehst du den slash / nehme ich mal an.
d.h. wenn ich die sed commands in ein file schreibe wuerde das so aussehen:
s/suche/ersetze/g
...

na jedenfalls nochmals danke fuer eure antworten, so langsam peil ich's wohl. ;)

gr33tz

butterkeks
19.01.2005, 19:49
nope, der Slash nicht (sonst müsste man Dateinamen immer in Anführungszeichen angeben); demnach könnte man das oberste auch ohne quotes an die shell übergeben.

Sonderzeichen sind z.B. die Anführungszeichen, leerzeichen und diverse andere; Im Zweifellsfall einfach quoten/escapen oder in der manpage der Shell nachsehen.

Wenn du das ganze in ein Shell script schreibst, kommste leider nicht um das quoten/escapen herum, falls du das so meinstest.
In einem sed script braucht man das natürlich nicht

raptor666
19.01.2005, 20:45
da hat sich mein vermeindliches regex problem doch zu (m)einem shell problem entwickelt :rolleyes:
sollte mich wohl mal besser damit auseinandersetzen.

danke nochmal

raptor666
20.01.2005, 07:15
noch ne kleine korrektur:

sed "s/'/\'/g" textfile

geht so leider nicht, der backslash muss noch escaped werden:

sed "s/'/\\'/g" textfile

dann gehts und ' wird durch \' ersetzt.

butterkeks
20.01.2005, 14:29
bei mir schon