2017-02-13 16 views
0

У меня есть каталог с большим количеством 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' {} \; 
+1

Было бы безопаснее анализировать файлы с помощью парсера HTML, а затем заменить '@ href'' // a [@ href = "foo"] [text() = "Second"] 'на' bar' , – choroba

+0

@choroba Я никогда не пытался этого раньше, но быстрый поиск в Google показывает некоторые библиотеки python, которые могут сделать трюк. Что бы вы конкретно использовали? – jrounsav

ответ

0

вы, вероятно, не хотели бы, чтобы заменить все foo с. Более ограниченный поиск/замена может быть

... sed -r 's~(<a href=")foo(">Second</a>)~\1bar\2~' 
+0

Вы действительно собираетесь предлагать 'sed' для html? – hek2mgl

+0

Если у вас есть инструмент для обработки текста в качестве вашего молотка, все проблемы будут выглядеть как гвозди. :) – karakfa

+0

Вы имеете в виду '... будет выглядеть как обычный текст'. Но это не так. – hek2mgl

0

После реализации части ответа @karakfa «s, я понял, что мне нужно также искать до (и включая) вторую часть регулярного выражения. Так как в моем реальном случае использования в теге привязки были потенциально другие атрибуты. После того, что я придумал этот бит, используя Perl, а не СЭД, поскольку СЭД не работает с не-я включать

find . -type f -exec perl -pi -e 's%foo(?=.*Second)%bar%g' {} \; 

ищет все файлы, найти и заменить на обув с баром, где второй следует где-то в линии.