
Думаю, это будет довольно сложно.
Мне нужно повозиться с инлайн-документацией, которая извлекается в 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
'
На самом деле это довольно просто, но элегантно.