Добавлять текст к строкам между двумя шаблонами каждый раз, когда они появляются в файле

Добавлять текст к строкам между двумя шаблонами каждый раз, когда они появляются в файле

Думаю, это будет довольно сложно.

Мне нужно повозиться с инлайн-документацией, которая извлекается в html-файлы для использования в качестве онлайн-документации, но эти части файлов должны быть без html-
тегов в инлайн-форме, но только в извлеченных html-файлах. Однако, поскольку эти части документации также извлекаются в .wiki-файл, некоторые теги уже там есть, как здесь.

this is some text describing what is done
<code>
here are 
some line that will be shown as code in wiki 
but not on html cause they are shown on one line
in html output
</code>

some more describing text
<code>
another piece of code 
that shows up as multiple lines in the wiki
but not in htmls
</code>

После извлечения этих частей документации, что легко сделать с помощью sed, я хочу преобразовать извлеченный файл в следующее:

this is some text describing what is done
<code><br/>
here are <br/>
some line that will be shown as code in wiki <br/>
but not on html cause they are shown on one line<br/>
in html output<br/>
</code><br/>

some more describing text
<code><br/>
another piece of code <br/>
that shows up as multiple lines in the wiki<br/>
but not in htmls<br/>
</code><br/>

Пока что у меня получилась следующая строка sed:

sed -i '/\<code>/,/\<\/code>/{s/$/\<br\/>/}' file

но он также добавляет html-теги к тексту между областями кода, например:

this is some text describing what is done
<code><br/>
here are <br/>
some line that will be shown as code in wiki <br/>
but not on html cause they are shown on one line<br/>
in html output<br/>
</code><br/>
<br/>
some more describing text<br/>
<code><br/>
another piece of code <br/>
that shows up as multiple lines in the wiki<br/>
but not in htmls<br/>
</code><br/>

В принципе это правильно, потому что sed добавляет данные ко всем строкам между первым and the lastтегом, но это не то, что я имел в виду.

Может ли кто-нибудь подсказать мне, что я здесь упускаю?

решение1

У вас неправильные обратные косые черты. Выражение \<делаетнетсоответствует буквальному левому символу-слэшу — неэкранированный символ <прекрасно соответствует сам себе, но с помощью обратной косой черты вы превращаете его в утверждение левой границы слова нулевой ширины, которое никогда не может встретиться рядом со слэшем; поэтому выражение \</code>никогда не сможет соответствовать чему-либо.

С небольшим рефакторингом для исправления других просто излишних гиперкорректностей, исправленный sedскрипт

sed -i '/<code>/,\%</code>%s:$:<br/>:' file

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

Демонстрация:http://ideone.com/feVWgO

решение2

Хорошо, решение найдено, хотя и не с sed, а с awk.

awk '
  BEGIN{c=0} // initialize variable with zero
  /\<code>/{c=1} // if start pattern found set variable to 1
  {if (c==1) print $0,"<br/>"} // if variable is one, append tag
  {if (c==0) print $0} // if variable is zero just print line
  /\<\/code>/{c=0} //if endpattern is found set variable to zero
  '

На самом деле это довольно просто, но элегантно.

Связанный контент