2012-08-29 25 views
29

Das ist, was ich tue (vereinfachtes Beispiel):Was ist los mit meinem Lookahead Regex in GNU Sed?

gsed -i -E 's/^(?!foo)(.*)$/bar\1/' file.txt 

Ich versuche bar vor jedem Spiel zu setzen, die mit foo nicht starten. Dies ist der Fehler:

gsed: -e expression #1, char 22: Invalid preceding regular expression 

Was ist los?

+0

mögliches Duplikat von http://stackoverflow.com/questions/2086450/pcre-regex-to-sed-regex – hostmaster

+1

Bitte aktualisieren Sie die gewählte Antwort wenn möglich. [This] (http://stackoverflow.com/a/12178023/131120) zeigt, dass es tatsächlich möglich ist, dasselbe mit sed zu erreichen. – erikbwork

Antwort

36

Soweit ich weiß sed hat weder Look-Ahead noch Look-Behind. Wechseln Sie zu einer stärkeren Sprache mit ähnlicher Syntax wie perl.

+14

Eine einfache 'sed' zu 'perl' Konvertierung als Referenz:' sed 's/vor/nach/g'/meine/Datei' => 'cat/my/file | perl -ne/vor/nach/g; Drucken; – Batandwa

+4

@Batandwa http://www.smallo.ruhr.de/award.html – ceving

+7

@Batandwa Die Verwendung von Katze und Rohrleitungen in Perl ist überflüssig. Benutze einfach 'perl -pi -e '/ vor/nach/g'/meine/Datei'. – ypid

6

Sie verwenden Perl-kompatible Regular Expression (PCRE) -Syntax, die nicht von GNU sed unterstützt wird. Sie sollten Ihre Regex nach SED Regular-Expressions umschreiben oder stattdessen Perl verwenden.

83
sed -i '/^foo/! s/^/bar/' file.txt 
  • -i => Änderung der Datei anstelle
  • /^foo/! => nur die nächste Aktion auf Linien führen nicht (!) mit Start foo (^foo)
  • s/^/bar/ => Änderung der Anfang der Zeile bar  
+3

Sehr schöne Lösung. Keine Notwendigkeit für Rückverfolgung. Verwenden Sie einfach die Funktionalität, die sed bereits besitzt. –

+7

Das ist gut für einen verankerten Ausdruck wie '^ foo', aber reicht leider nicht zum allgemeinen Fall von negativem Lookahead irgendwo in einem Muster. – tripleee