Sed regexp multiline - заменить HTML

Я пытаюсь заменить несколько строк с помощью sed в системе Linux

Вот мой файл

<!-- 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 заменить

Ответы на вопрос(2)

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

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;}'

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

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

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

 Christopher Wilson15 июн. 2012 г., 03:12
Теперь, что я делаю не так?sed -i 's/<!-- PAGE TAG -->/,/<!-- PAGE TAG -->/Replace Data/g'
 Christopher Wilson15 июн. 2012 г., 03:19
Я не могу запустить sed заменить текст с помощью.sed 's/<!-- PAGE TAG -->\/,\/<!-- PAGE TAG -->/Data2/'  Что это/d делать?
 Christopher Wilson15 июн. 2012 г., 03:34
Не работает, как ожидалосьpastebin.com/JRkPy7Wf
Решение Вопроса

это решение является ответом на ваши комментарии:

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

Вы можете прочитать это так:

/<!-- PAGE TAG -->/,/<!-- PAGE TAG -->/ - & GT; для строк между этими регулярными выражениями

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

s/^.*$/Replace Data/ - & GT; искать что-нибудь и заменить наReplace Data

b - & GT; переход к концу (в данном случае ведет себя как разрыв)

d - & GT; в противном случае удалите строку

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

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

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

 Christopher Wilson15 июн. 2012 г., 03:38
Большое вам спасибо, это прекрасно работает. Во всяком случае, чтобы сделать этоone liner ?
 15 июн. 2012 г., 04:02
@ChristopherWilsonaddress { } просто группирует команды для запуска на конкретномaddress, Это & APOS; sbranching это трудно обернуть голову вокруг. Как только вы поймете это, вы сможете считать себя настоящим опытным пользователем sed. Happy Coding!
 Christopher Wilson15 июн. 2012 г., 03:52
Спасибо @timpote, я обновил свой вопрос. Спасибо за отличный ответ и объяснение, которое я не зналsed может быть использован с{ скобки выглядят как условные операторы if !! Я определенно многому научился из вашего ответа. Спасибо! хорошего дня.
 15 июн. 2012 г., 04:21
Решение, которое охватывает несколько строк, прекрасно работает на Mac, но однострочное решение, по-видимому, не работает на Sed Mac. Кажется, что команда ветки по какой-то причине пытается использовать как можно больше символов в строке при поиске метки.
 15 июн. 2012 г., 03:47
@ChristopherWilson Смотрите мои правки.

Ваш ответ на вопрос