2013-06-21 21 views
5

Sto analizzando un file PHP e avvolgendo gli elementi del prototipo di funzione in HTML. Se ci sono e commerciali, tuttavia, si rompe il mio codice.Sed e Awk in uscita e commerciale (&)

ingresso: function foo (&$var1, &$var2){...} // as String
output desiderato (in HTML): &$var1, &$var2// fondamentalmente, solo le variabili di uscita in modo che siano correttamente visualizzate in un browser

questo momento , Sto inviando ciascuna variabile nel sub metodo awk , e quindi a sed.

sub(/^&/, "\\\&", param) #param is the variable of interest (e.g. &$var1) 

#Intermediate step in case it's relevant. The awk-processed elements 
#are sent to ${file}_param.txt. Each set of parameters are delimited by colons. 
param=$(cut -d: -f$counter ${file}_param.txt) 

#Replace some default text in template file with real stuff. 
sed -i "s|@PARAM|$param|1" "$base"_funct_def.txt 

uscita sto ottenendo: I e commerciali vengono interpretati. L'intera partita è sostituita.

Isolamento del numero: Fare quanto segue visualizza invece 'g $ var1' nel browser come voglio. Tuttavia, sto cercando di ottenere un '&'.

sub(/^&/, "g", param) 

I miei tentativi: Ho usato tre backslash perché ho pensato che sarebbe awk primo processo in '\ &', che, immessa nella sed, potrebbe interpretare '\ &' come il letterale '&'. Tuttavia, ho provato ovunque da 1 a 6 backslash, senza alcun risultato.

DOMANDA: Come posso sfuggire allo &?

manuale: http://www.staff.science.uu.nl/~oostr102/docs/nawk/nawk_92.html


Alcuni/domande di design "meta" su quello che sto cercando di fare (non necessario per la domanda !!)
ho mucchio di File PHP che sto cercando di generare un po 'di documentazione per (strutturato come Javadocs). Sto esaminando e analizzandolo usando REGEX e gli script di shell, in modo da elencare il nome della funzione, i parametri e gli elementi restituiti. Finora, REGEX ha funzionato abbastanza bene, penso, ma ho letto molto su come questo è qualcosa per cui REGEX NON dovrebbe essere usato. Sarei lieto di ricevere commenti in merito a ciò (come viene solitamente generata la documentazione?). Grazie ragazzi!

+0

Cosa significa '$ param' in realtà contengono? Se i comandi non vengono eseguiti in modo sequenziale (ad esempio se ci sono in realtà alcuni altri codici in mezzo), non dovresti metterli nello stesso blocco di codice, è fuorviante. – doubleDown

+0

Ci scusiamo per la parte fuorviante. Lo terrò a mente in futuro. Il parametro $ contiene un elemento parametro. Per esempio, se c'è una funzione: 'function foo (& $ arg1, $ arg2)' $ param dovrebbe essere ''& $ arg1'' Buone notizie però: ho trovato una soluzione. Prima di eseguire sed, mi sono assicurato di scappare da qualsiasi '&'. Ho aggiunto il seguente a destra dopo il primo param assegnamento: 'param = $ (echo $ param | sed 's |^& | \\ & | g')' Questo è in contrasto con il tentativo di avvolgere le cose nell'avk porzione del codice. – bobbyjoe93

risposta

0

Credo che HTML legga & come carattere di e commerciale. Nello script awk si potrebbe usare:

sub(/^&/, "&", param) 

Il simbolo del dollaro in param deve essere sfuggito con un backslash, per esempio & $ var deve essere scritto come & \ $ var, oppure sed e awk proveranno ad espandere $ var come variabile.

+1

Purtroppo, non penso che sia questo il problema. Sostituendolo con "& amp" verrà comunque interpretato da awk e sed come REGEX '&', che duplica l'elemento abbinato nell'output. (Ho provato quello che mi hai suggerito solo come controllo di sanità mentale. Non ha funzionato.) – bobbyjoe93

+0

Ho cambiato la mia risposta dopo aver fatto alcuni test. I segni del dollaro non sfuggiti sembrano causare il problema. – gbrener

0

L'utilizzo di due barre rovesciate (ad esempio sub(/^&/, "\\&", param)) funziona per me. Non funziona per te?

È documentato in the nawk manual voi indicati nella Sua domanda:

Come al solito, per inserire una barra rovesciata nella stringa, è necessario scrivere due barre rovesciate. Pertanto, prego scrivere `\\ & 'in una stringa costante per includere una` &' nella sostituzione

Inoltre, la funzione sub() essenzialmente rimpiazza una e commerciale con una commerciale. Quindi forse è per questo che pensi che non funzioni anche con due backslash.

+0

Ha funzionato dopo aver inviato l'output di sub a sed? Penso che sub sta emettendo un letterale '&', ma quando viene passato a sed, il '&' viene interpretato ancora una volta. Quindi, per sub, sto effettivamente cercando di produrre '\ &', in modo che venga scappato nella porzione sed. – bobbyjoe93

0

sed metodo:

printf "%s\n" 'function foo (&$var1, &$var2){...}//as String' | 
sed -n '/function/{s/^.*(//;s/).*$//;p}' 

uscita:

&$var1, &$var2 

Oppure, se è necessario il codice HTML, passare che a un util come txt2html:

printf "%s\n" 'function foo (&$var1, &$var2){...}//as String' | 
sed -n '/function/{s/^.*(//;s/).*$//;p}' | txt2html