Ich habe ein Verzeichnis mit viel HTML, und in diesem HTML sind verschiedene Anker-Tags mit unterschiedlichem Text, die gleich href.So ersetzen Sie alle Vorkommen einer Zeichenfolge in einem Ordner, wenn dieser Zeichenfolge eine andere Zeichenfolge folgt, über die Befehlszeile
<a href="foo">First</a>
<a href="foo">Second</a>
<a href="foo">Third</a>
<a href="foo">Second</a>
Wie könnte ich einen Befehl schreiben alle „foo“ Strings in dem Ordner auf die Spur, die von „Second“ gefolgt sind und foo neu schreiben?
Das wäre ideal Ausgang
<a href="foo">First</a>
<a href="bar">Second</a>
<a href="foo">Third</a>
<a href="bar">Second</a>
Ich habe sein dann mit dem folgenden, aber ich weiß nicht, wie zu begrenzen in der Art und Weise, die ich brauche Bisher kommen. Ich verwende Kommas, um Probleme mit "/" in der URL zu vermeiden.
find ./ -type f -exec sed -i -e 's,foo,bar,g' {} \;
Lösungen ohne find/sed sind ebenfalls akzeptabel.
EDIT - meine Lösung
Nach Teil @karakfa ‚s Antwort Umsetzung unter erkannte ich, dass ich brauchte auch zu suchen (und verstehen sich inklusive), um den zweiten Teil der Regex. Da in meinem realen Anwendungsfall möglicherweise andere Attribute im Anker-Tag waren. Danach habe ich mit diesem Bit mit Perl kam statt sed, da sed nicht mit der Arbeit-nicht enthalten I
verwendetfind . -type f -exec perl -pi -e 's%foo(?=.*Second)%bar%g' {} \;
Es wäre sicherer, die Dateien tatsächlich mit einem HTML-Parser zu analysieren und dann '@ href' von' // a [@ href = "foo"] [text() = "Second"] 'durch' bar' zu ersetzen . – choroba
@choroba Ich habe das noch nie zuvor versucht, aber eine schnelle Google-Suche zeigt einige Python-Bibliotheken, die den Trick machen könnten. Was würden Sie speziell verwenden? – jrounsav