Regulärer Ausdruck gesucht

Hallo, ich hoffe es passt in diesen Bereich.

Ich habe hier einen Texteditor, welcher das Suchen und Ersetzen mittels regulärer Ausdrücke unterstützt (Smultron für Mac OS X). Klappt auch sehr gut, nur diese vergleichsweise einfach anmutende Aufgabe beschert mir graue Haare:

Gesucht ist ein regulärer Ausdruck, welcher das erste Auftreten eines Zeichens (in meinem Fall des Tabulator-Zeichens) bezeichnet (Standardverhalten meines Editors ist greedy).

Eine Beispiel-Zeile:

Code:
3454 	2920 	8139	1830

Ich möchte in derartigen Zeilen nur das erste Tabulator-Zeichen gegen eine andere Zeichenkette austauschen. Das muss doch mittels regulärem Ausdruck irgendwie zu machen sein, oder?

Zusatzfrage dazu, überhaupt nicht brennend: Angenommen, ich wollte nur das zweite Tabulator-Zeichen austauschen ... ;-)

Help!
 
Code:
sed 's/^\(\S\)*\s\(.*\)$/\1a\2/g'

bzw:

Code:
^(\S)*\s(.*)$

das matcht die ganze Zeile, über die Klammer kannst Du das erste Whitespace-Vorkommen ersetzen.
 
Eigentlich müsste es auch so gehen:
Code:
(?=^(\t)*)\t
Zur Erklärung der Theorie in meinem Kopf ^^:
Der Tabulator "\t" ist gesucht. Da es der erste Tabulator ist darf kein anderes Tablutorzeichen vorausgehen, d.h. x beliebige Zeichen ungleich \t ("^(\t)*"). Der Klammerausdruck (?= ) wird als "positive look-ahead assertion" bezeichnet. So kann der Ausdruck als Bedingung zwar angeben, wird im Ergebnis jedoch nicht mit aufgeführt. Achtung nicht jede Sprache versteht look-around assertion, somit eventuell dein Programm nicht, aber du kannst es ja ausprobieren.
 
Zunächst vielen Dank für eure Antworten.

Code:
^(\S)*\s(.*)$

das matcht die ganze Zeile, über die Klammer kannst Du das erste Whitespace-Vorkommen ersetzen.

Zur Verdeutlichung, ich habe zwei Eingabefelder, eines für den Suchstring als regulären Ausdruck, und eines für den Ersetzungstext. Mir ist nicht klar, was du mit "über die Klammer ersetzen" meinst? Ich selektiere ja in dem Beispiel auf komplizierte Weise einfach die ganze Zeile.

@HonniCilest: Derartige Positive look-ahead assertions sind äußerst praktisch, damit gäbe es eine Reihe von Lösungen für mein Problem. Leider werden Sie von meinem Editor tatsächlich nicht unterstützt und auch nicht von einem weiteren, den ich ausprobiert habe.

Wenn jemanden einen freien Editor für Mac OS X empfehlen kann, der diese Funktionalität bietet?

Ein Variablen-Konzept gibt es auch nicht in regulären Ausdrücken, oder? Idee wäre, im Ersetzungstext einen im Suchstring-Ausdruck spezifizierten Teil wieder einzufügen. Dann wär's auch kein Problem.

Falls die Geschichte mit regulären regulären Ausdrücken nicht machbar ist, werde ich mir morgen früh ein AppleScript - ohne reguläre Ausdrücke, mit String-Operationen - für dieses spez. Problem basteln. Konnte mir bloß überhaupt nicht vorstellen, dass es auf ein derartig einfach gestricktes Standardproblem keine einfache Standardantwort gibt.
 
Hi.
Zur Verdeutlichung, ich habe zwei Eingabefelder, eines für den Suchstring als regulären Ausdruck, und eines für den Ersetzungstext. Mir ist nicht klar, was du mit "über die Klammer ersetzen" meinst? Ich selektiere ja in dem Beispiel auf komplizierte Weise einfach die ganze Zeile.
Ist es denn nicht möglich im Ersetzungstext Referenzen zu den vorher selektierten Gruppen anzugeben? Üblicherweise mit \1 \2 usw.

Meine Suche ergab, das Smultron die ICU reg. Expression Engine verwendet. Diese unterstützt eigentlich alle üblichen look* assertions.

Das Problem mit dem Ausdruck von Honnicliest ist bloss das dieser nicht funktionieren kann. Erstens müßte man die Zusicherung negieren - es sollen ja gerade keine \t vor dem zu selektierenden \t sein. Außerdem bewegt eine Lookahead Assertion die Eingabe nicht weiter, so das die Eingabe immer noch am Zeilenanfang steht und nicht bei dem ersten \t - und somit erfolgt auch keine Übereinstimmung.

Weiterhin verwendet ICU für Referenzen auf die Gruppen das Zeichen $. Also sollte der Ausdruck "^([^\t]*)\t" mit der Ersetzung "$1X" eigentlich das gewünschte Ergebnis bringen. (hierbei wird das erste \t durch ein X ersetzt).

Gruß

\edit: Um das zweite Zeichen zu selektieren: "^([^\t]*\t[^\t]*)\t".
 
Zuletzt bearbeitet:
Hell yeah! Du bist mein Held. Es funktioniert genau, wie du sagst. Das man im Ersetzungstext Referenzen verwenden kann, war mir neu, die Smultron-Hilfe zeigt so gut wie nix an. Hab mir gerade den ICU User Guide an die Wand gepappt, das macht das Programm 1000 x wertvoller für mich. Also: 1000 Dank!

*happy*
 
Zurück