Anhängen von Text an Zeilen zwischen zwei Mustern, jedes Mal wenn diese in einer Datei vorkommen

Anhängen von Text an Zeilen zwischen zwei Mustern, jedes Mal wenn diese in einer Datei vorkommen

Das wird ziemlich schwierig, schätze ich.

Ich muss mit Inline-Dokumentationen herumspielen, die in HTML-Dateien extrahiert werden, um als Online-Dokumentation verwendet zu werden. Diese Teile der Dateien sollten jedoch
in der Inline-Form ohne HTML-Tags sein, aber nur in den extrahierten HTML-Dateien. Da diese Dokumentationsteile jedoch auch in eine .wiki-Datei extrahiert werden, sind einige Tags bereits so vorhanden.

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>

Nach dem Extrahieren dieser Teile der Dokumentation, was einfach über sed geht, möchte ich die extrahierte Datei wie folgt seden:

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/>

Was ich bisher habe, ist diese Sed-Zeile:

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

sondern hängt die HTML-Tags auch an den Text zwischen den Codebereichen an, und zwar wie folgt:

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/>

Das ist grundsätzlich richtig, da sed an alle Zeilen zwischen dem ersten and the lastTag anhängt, aber es ist nicht das, was ich beabsichtigt habe.

Kann mir jemand einen Hinweis geben, was ich hier übersehe?

Antwort1

\<Sie haben falsche Backslashes. Der AusdrucknichtÜbereinstimmung mit einem wörtlichen linken Schrägstrich – ein nicht maskiertes Zeichen <stimmt problemlos mit sich selbst überein, aber mit dem Backslash ändern Sie es in eine Behauptung mit der Breite Null für die linke Wortgrenze, die nie neben einem Schrägstrich vorkommen kann; daher \</code>kann der Ausdruck nie mit irgendetwas übereinstimmen.

Mit einigen geringfügigen Refactorings, um auch andere lediglich überflüssige Hyperkorrektheiten zu beheben, sedist ein korrigiertes Skript

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

Ich habe mir die Freiheit genommen, die Schrägstriche durch etwas anderes zu ersetzen, um die Notwendigkeit von Backslashes noch weiter zu verringern.

Demo:http://ideone.com/feVWgO

Antwort2

OK, habe eine Lösung gefunden, allerdings nicht mit sed, sondern mit 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
  '

Das ist eigentlich ganz einfach, aber elegant.

verwandte Informationen