2012-06-15 2 views
4

Я пытаюсь заменить несколько строк с использованием СЭД на системе LinuxSed регулярное выражение многострочный - заменить HTML

Вот мой файл

<!-- PAGE TAG --> 
DATA1 
DATA2 
DATA3 
DATA4 
DATA5 
DATA6 
<div id="DATA"></div> 
DATA8 
DATA9 
<!-- PAGE TAG --> 

попытки я сделал и не удалось!

sed -n '1h;1!H;${;g;s/<!-- PAGE TAG -->.*<!-- PAGE TAG -->//g;p;}' 
sed -n '1!N; s/<!-- PAGE TAG -->.*<!-- PAGE TAG -->// p' 
sed -i 's|<!--[^>]*-->[^+]+<!--[^>]*-->||g' 
sed -i 's|/\/\/<!-- PAGE TA -->/,/\/\/<!-- PAGE TA -->||g' 

Все, что находится между <!-- PAGE TAG -->, должно быть заменено.

Этот вопрос похож sed multiline replace

ответ

3

Хотя @ nhahtdh Ответим является правильным для вашего первоначального вопроса, это решение является ответом на Ваши комментарии:

sed ' 
    /<!-- PAGE TAG -->/,/<!-- PAGE TAG -->/ { 
    1 { 
     s/^.*$/Replace Data/ 
     b 
    } 
    d 
    } 
' 

Вы можете прочитать его следующим образом:

/<!-- PAGE TAG -->/,/<!-- PAGE TAG -->/ -> для линий между этими регулярными выражениями

1 { -> для первой совпадающей строки

s/^.*$/Replace Data/ -> поиск для чего и заменить Replace Data

b -> ветка до конца (ведет себя как разрыв в данном случае)

d -> в противном случае, удалите строку

Вы можете сделать любую серию SED команд в одну -liners с гну SED, добавив точку с запятой после каждой команды (но это не рекомендуется, если вы хотите, чтобы иметь возможность читать его позже):

sed '/<!-- PAGE TAG -->/,/<!-- PAGE TAG -->/ { 1 { s/^.*$/Replace Data/; b; }; d; };' 

Как примечание, вы должны действительно стараться быть максимально конкретными в своей публикации. «заменено/удалено» означает «заменено ИЛИ удалено». Если вы хотите, чтобы он был заменен, просто скажите, что он заменен. Это помогает как тем, кто из нас пытается ответить на ваш вопрос и будущим пользователям, которые могут испытывать ту же проблему.

+0

Большое вам спасибо, что отлично работает. В любом случае, чтобы сделать это ** одним вкладышем **? –

+0

@ChristopherWilson Посмотреть мои правки. –

+0

Спасибо @timpote, Я обновил свой вопрос. Спасибо за отличный ответ и объяснение, о котором я не знал ** sed ** можно было использовать с ** {** скобки выглядели условно, если заявления !! Я определенно многому научился от вашего ответа. Спасибо! удачного дня. –

4

Адаптирование от ответа, данного в ссылке, которую вы видите, это должно работать:

sed '/<!-- PAGE TAG -->/,/<!-- PAGE TAG -->/d' 

Формат регулярных выражений является [2addr]d, где 2 адреса /<!-- PAGE TAG -->/ и /<!-- PAGE TAG -->/, которые разделены запятой. d означает удаление всех строк, начиная с строки, соответствующей первому адресу, в строке, соответствующей последнему адресу включительно. (Это означает, что объекты вне тега, но в той же строке, что и тег, также будут удалены).


Хотя Тим Потье ответил на вопрос, я просто этот пост здесь только в случае, если кто должен заменить многострочный шаблон:

sed -n '1h; 1!H; ${g; s/<!-- PAGE TAG -->[^!]*<!-- PAGE TAG -->//g; p;}' 

Я изменил решение от существующего источника, так что большинство команды объясняется here.

Регулярное выражение здесь немного неоднородно, так как предполагается, что в данных между двумя тегами страницы нет знака !. Без этого предположения я не могу контролировать количество символов, сопоставляемых регулярным выражением, так как нет ленивого квантификатора (насколько я знаю).

Это решение не удаляет текст перед тегом, даже если он находится на той же строке, что и тег.

+0

Теперь то, что я делаю неправильно 'SED -i«с/ /,/<- Страница TAG ->/Заменить/g'' –

+0

Я не могу данных для запуска sed заменить на текст с помощью. 'sed 's/ \ /, \//Data2 /'' Что делает **/d **? –

+0

Не работает как ожидалось http://pastebin.com/JRkPy7Wf –

Смежные вопросы