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

Я должен возиться со встроенной документацией, которая извлекается в 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 тегом, но это не то, что я хотел.

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

2 ответа2

1

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

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

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

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

Демо: http://ideone.com/feVWgO

0

ОК, нашел решение, но не с помощью 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
  '

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .