Aggiungi testo alle righe tra due motivi ogni volta che compaiono in un file


0

Sarà piuttosto difficile, immagino.

Devo giocherellare con la documentazione in linea che viene estratta in file html per essere utilizzata come documentazione online, ma queste parti dei file dovrebbero essere senza
tag html nel modulo in linea, ma solo sui file html estratti. Tuttavia, poiché anche queste parti della documentazione vengono estratte in un file .wiki, alcuni tag sono già presenti in questo modo.

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>

Dopo l'estrazione di queste parti della documentazione che è facilmente eseguibile tramite sed, voglio sed il file estratto a questo:

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

Ciò che ho ottenuto finora è questa linea sed:

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

ma aggiunge i tag html anche al testo tra le aree di codice in questo modo:

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

Questo è fondamentalmente corretto, perché sed aggiunge tutte le righe tra il primo and the last tag, ma non è quello che intendevo.

Qualcuno può darmi un suggerimento su ciò che mi manca qui?

Risposte:


1

Le barre rovesciate non sono corrette. L'espressione \<non non corrisponde a un broket letterale sinistra - un escape <per sé corrisponde bene, ma con la barra inversa, si cambia in un confine di parola sinistra larghezza zero affermazione, che non può mai succedere ad una barra; quindi l'espressione \</code>non può mai eguagliare nulla.

Con alcuni refactoring minori per correggere anche un'altra ipercorruzione semplicemente superflua, uno sedscript fisso è

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

Mi sono preso la libertà di cambiare le barre in qualcos'altro per rimuovere ulteriormente la necessità di barre rovesciate.

Demo: http://ideone.com/feVWgO


Questo è davvero fantastico, grazie per questo. Potresti spiegare la parte "% s: $: <br/>:", poiché questa sembra essere la parte funzionante?
Oliver Friedrich,

1
Stai analizzando nel modo sbagliato. La sintassi generale è indirizzo seguito dal comando . L' indirizzo in questo caso è un intervallo da <code>(tra virgolette) a </code>(tra virgolette, con una barra rovesciata davanti per cambiare il delimitatore di virgolette) e il comando è s:$:<br/>:che sostituisce $(che è un segnaposto che corrisponde alla fine della riga) con <br/>, usando i due punti come delimitatori regex. Il vero manzo qui sta cambiando la regex di fine gamma in modo che corrisponda correttamente alla </code>lettera. Il resto delle mie modifiche sta zuccherando per evitare di dover usare così tante barre rovesciate.
Tripleee

0

OK, ho trovato una soluzione, anche se non con sed, ma con 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
  '

Questo è in realtà abbastanza semplice ma elegante.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.