2017-09-20 1 views
1

ich auf einem seltsam bisschen Verhalten auf BSD von Mac OS X. sed ausgeführt habeOdd sed Verhalten beim Start der Linie ersetzt

sed -e '{s/^/ /;s/\(a*\)/\1b/;}' 

Also das im Grunde fügt nur ein paar Räume zu Beginn der Linie, dann ersetzen Sie eine beliebige Anzahl von aufeinanderfolgenden 'a' mit der gleichen Sache, gefolgt von einem b.

Erwartet:

|Input |Output 
|a  | ab 
|aa  | aab 
|aaa  | aaab 

Aktuell:

|Input |Output 
|a  |b a 
|aa  |b aa 
|aaa  |b aaa 

die Reihenfolge dieser beiden Befehle führt zu dem erwarteten Ergebnis umzukehren. Mein Verständnis der Sache, die getan wird, ist eine Zeile wird in den Musterraum gelesen, dann werden alle Ausdrücke der Reihe nach angewendet, dann wird die nächste Zeile in den Musterraum eingelesen und der Prozess wird wiederholt. Es scheint eine gewisse

ich auch

sed -e '{s/^/ /;s/\(a+\)/\1b/;}' 

versucht haben zu sein, die nichts tut, um alle außer die Räume hinzufügen.

Meine Frage ist, warum ersetzt der Anfang der Zeile mit diesem Effekt?

+1

Ihre zweite Regex paßt immer am Anfang des Strings. Die erste Substitution ändert das nicht. – melpomene

Antwort

3

Die * bedeutet null oder mehr, nicht ein oder mehr. Seit null oder mehr a kann alles sein, die b wird direkt am Anfang der Linie platziert - das ist die frühest mögliche Position.

Die + wird nicht von posix regular expressions verstanden, die von sed verwendet werden.


können Sie verwenden:

sed -e 's/^/ /;s/\(a\{1,\}\)/\1b/;' 

\{1,\} bedeutet eine oder mehrere und ist allgemein, das heißt, Sie es auch für passende Gruppen, wie diese verwenden: Wenn

\(foo\)\{1,\} 

Sie suchen nach einem einzelnen, wiederholten Zeichen, das Sie einfach verwenden können:

aa* 

(dank melpomene für mich auf, dass daran erinnert)

+3

In diesem Fall wäre 'aa *' einfacher. – melpomene

+0

@melpomene Das stimmt. Ich habe das hinzugefügt. – hek2mgl

+0

Könnten Sie dies bearbeiten, um OP klar zu zeigen, warum Ihr Muster funktioniert und es nicht schafft, das zu tun, was er erwartet. Es kann für Sie und mich klar sein, wie Ihre Antwort sein Problem löst, aber Sie haben das Problem nicht aufgezeigt. –