Kann sed regex Lookbehind und Lookahead simulieren?

8

Ich versuche ein sed-Skript zu schreiben, das alle "nackten" URLs in einer Textdatei erfasst und sie durch <a href=[URL]>[URL]</a> ersetzt. Mit "nackt" meine ich eine URL, die nicht in einem Anker-Tag eingeschlossen ist.

Mein ursprünglicher Gedanke war, dass ich URLs, die kein "oder ein & gt; vor ihnen haben, und auch kein & lt; oder a" hinter ihnen haben sollte. Allerdings stoße ich in Schwierigkeiten mit dem Ausdruck "habe nicht vor oder hinter", denn soweit ich weiß, hat sed weder Vorausblick noch Rückblick.

Beispieleingabe:

%Vor%

Beispiel für eine gewünschte Ausgabe:

%Vor%

Beachten Sie, dass die dritte Zeile unverändert ist, da sie sich bereits in <a href> befindet. Auf der anderen Seite sind sowohl die erste als auch die zweite Zeile modifiziert. Beachten Sie schließlich, dass alle Nicht-URL-Texte unverändert sind.

Letztendlich versuche ich etwas wie:

%Vor%

Zuerst habe ich überprüft, ob die folgenden URLs richtig übereinstimmen und entfernt:

%Vor%

Ich habe es dann versucht, aber es ist nicht in der Lage URLs zu finden, die am Anfang der Datei / Eingabe beginnen:

%Vor%

Gibt es eine Möglichkeit, dies in sed zu umgehen, indem Sie Lookbehind / Lookahead simulieren oder den Anfang und das Ende der Datei explizit abgleichen?

    
merlin2011 15.02.2013, 01:24
quelle

2 Antworten

4

sed ist ein ausgezeichnetes Werkzeug für einfache Ersetzungen in einer Zeile, für alle anderen Textbearbeitungsprobleme einfach awk.

Überprüfen Sie die Definition, die ich im BEGIN-Abschnitt unten für eine reguläre Suche verwende, die URLs entspricht. Es funktioniert für Ihr Beispiel, aber ich weiß nicht, ob es alle möglichen URL-Formate erfasst. Auch wenn es nicht für Ihre Bedürfnisse geeignet ist.

%Vor%     
Ed Morton 15.02.2013, 14:59
quelle
1

Das offensichtliche Problem mit Ihrem Befehl ist

%Vor%

Das ist das Seltsame an sed regex. Es ist anders als bei Perl regex, dass viele Symbole standardmäßig "literal" sind. Sie müssen ihnen entkommen, um zu "funktionieren". Probieren Sie:

%Vor%     
texasbruce 15.02.2013 01:36
quelle