2012-07-19 13 views
12

Ho un file che contiene un po 'di lattice:Bash: Caratteri speciali persi durante la lettura di file

\begin{figure}[ht] 
\centering 
\includegraphics[scale=0.15]{logo.pdf} 
\caption{Example of a pdf file inclusion} 
\label{fig:pdfexample} 
\end{figure} 

voglio leggere in uno script bash:

while read line 
    do 
    echo $line 
    done < "my.tex" 

L'uscita è

begin{figure}[ht] 
centering 
includegraphics[scale=0.15]{logo.pdf} 
caption{Example of a pdf file inclusion} 
label{fig:pdfexample} 

Perché ho perso i backslash e gli spazi iniziali?

Come conservarli?

+1

Cosa stai facendo a ciascuna linea che richiede di leggerlo riga per riga? In questo momento, ovviamente, è possibile sostituire il ciclo while con 'cat my.tex'. – chepner

+0

Verifico effettivamente su ciascuna riga perché voglio mantenere una parte del file tra due "tag" speciali. – Barth

risposta

17

Hai perso i backslash e gli spazi perché bash (tramite il suo built incorporato) sta valutando il valore del testo - sostituendo le variabili, cercando i caratteri di escape (tab, newline), ecc. Vedi the manpage per alcuni dettagli. Inoltre, echo combinerà spazi bianchi.

Per quanto riguarda la loro conservazione, non sono sicuro che sia possibile. Probabilmente avrai recuperato i backslash:

while read -r line 
    do 
    echo $line 
    done < "my.tex" 

che dovrebbe essere modificato per non provare a valutare i backslash. Probabilmente continuerà comunque a inghiottire gli spazi iniziali.

Edit: impostare la variabile speciale $IFS alla stringa vuota, in questo modo:

export IFS= 

causerà gli spazi necessari per essere conservate in questo caso.

+2

Anche quotando '$ line' dovrebbe conservare gli spazi. – chepner

+0

@chepner - questo è quello che pensavo; certamente se ci fossero spazi in '$ line' è vero, ma si è scoperto che (sul mio sistema) sono stati rimossi da' read', prima di essere messi in '$ line'. –

+0

Grazie, -r è quello che stavo cercando. – Barth

0

È possibile utilizzare perl per tutti o parte dei requisiti di script?

perl -lne 'print;' my.tex 

Se si deve tardi shell-out per qualche altro strumento, si potrebbe ancora avere un problema, a meno che non è possibile passare i dati richiesti in un file.