У меня есть каталог с большим количеством HTML, и в этом HTML есть различные якорные теги с разным текстом, которые имеют тот же href.Как заменить все вхождения строки в папку, если за этой строкой следует другая строка, через командную строку
<a href="foo">First</a>
<a href="foo">Second</a>
<a href="foo">Third</a>
<a href="foo">Second</a>
Как я мог бы написать команду, чтобы выследить все «Foo» строку в папке, которые следует «второй» и переписать Foo?
Идеальный выход будет затем
<a href="foo">First</a>
<a href="bar">Second</a>
<a href="foo">Third</a>
<a href="bar">Second</a>
До сих пор я пришел со следующими, но я не знаю, как ограничить в в том, что мне нужно. Я использую запятые, чтобы избежать проблем с «/» в URL-адресе.
find ./ -type f -exec sed -i -e 's,foo,bar,g' {} \;
Решения без find/sed также приемлемы.
EDIT - мое решение
После реализации части ответа @karakfa «s ниже, я понял, что мне нужно также искать до (и включая) вторую часть регулярного выражения. Так как в моем реальном случае использования в теге привязки были потенциально другие атрибуты. После того, что я придумал этот бит, используя Perl, а не СЭД, поскольку СЭД не работает с не-я включать
find . -type f -exec perl -pi -e 's%foo(?=.*Second)%bar%g' {} \;
Было бы безопаснее анализировать файлы с помощью парсера HTML, а затем заменить '@ href'' // a [@ href = "foo"] [text() = "Second"] 'на' bar' , – choroba
@choroba Я никогда не пытался этого раньше, но быстрый поиск в Google показывает некоторые библиотеки python, которые могут сделать трюк. Что бы вы конкретно использовали? – jrounsav