Sed entfernen alle beginnenden Musterübereinstimmungen von der Linie

11

Ich habe die folgende Zeile:

abababtestab

Ich versuche, einen sedAusdruck zu finden, um alle Vorkommen abvom Zeilenanfang zu entfernen , sodass die transformierte Zeile wie folgt lauten sollte:

testab

Ich denke, das sollte einfach sein, aber ich weiß wirklich nichts darüber sed.

Was ich bisher habe ist:

sed 's/^ab//'

Dies entfernt jedoch nur das erste Auftreten von ab.

Dan
quelle

Antworten:

16
sed 's/^\(ab\)*//' <in >out

Sie sollten es gruppieren.

echo ababababtestab |
sed 's/^\(ab\)*//'

testab

Einige ältere seds können damit jedoch nicht sehr gut umgehen. Obwohl die Duplizierung von Unterausdrücken eine von POSIX spezifizierte Funktion von BRE ist, wird sie von einigen sednicht ordnungsgemäß unterstützt. In einigen davon jedoch ...

echo abababtestab |
sed 's/^\(ab\)\1*//'

... könnte stattdessen funktionieren.

mikeserv
quelle
Genau das, wonach ich gesucht habe, danke! (Ich werde als Antwort markieren, sobald es mich lässt)
Dan
Sogar die 7. Ausgabe sedvon circa 1979 unterstützte es. Es müsste eine minderwertige Nachahmung sein, um die Gruppierung nicht zu handhaben.
Jonathan Leffler
@ JonathanLeffler - siehe die POSIX- Begründung für reguläre Ausdrücke , auf die ich die Aussage teilweise gestützt habe. Vielleicht ist es eine Annahme, aber es gibt dort einen Absatz ... Die Standardentwickler betrachteten das allgemeine historische Verhalten, das unterstützt wurde \n*, aber nicht \n\{min,max\}. \(...\)*, oder \(...\)\{min,max\}als nicht beabsichtigtes Ergebnis einer bestimmten Implementierung, und sie unterstützten sowohl Duplizierungs- als auch Intervallausdrücke nach Unterausdrücken und Rückverweisen.
Mikeserv
@ JonathanLeffler: Es funktioniert auch nicht mit der sed-Version von Erbstück-Werkzeugkisten.
Cuonglm
@cuonglm - Die \(ab\)\1*Version funktioniert mit dem Standard-Erbstück sedund die \(ab\)*Version funktioniert mit dem SuSv4-Erbstück sed. Zumindest für meinen Build. Zugegeben, ich habe mein Erbstück gegen musl lib C gebaut, und so kann ich mir vorstellen, dass es sich dadurch möglicherweise anders verhält. Aber normalerweise, wenn eine bestimmte Funktion in einem Erbstück-SuSv4-Erbstück-Werkzeug funktioniert, aber nicht im Standard-Werkzeug, liegt dies daran, dass der Entwickler es geschafft hat.
Mikeserv
6

Ein anderer sed:

sed -e ':1' -e 's/^ab//;t1'

Mit jeder Eingabezeile richten wir eine Beschriftung ein :1und führen dann am Anfang der Zeile eine sSubstitution abdurch. Wenn substitution erfolgreich, test Befehl Zweig Etikett 1, das Werk bis kein Redo - abMuster erschien am Anfang der Linie, sind wir fertig.

cuonglm
quelle
Genau meine Gedanken. Streng genommen müssen Sie nicht testen: s/^ab//; t1ist ausreichend
Glenn Jackman
@glennjackman: Ah, natürlich. Aktualisiert es!
Cuonglm