2011-11-10 15 views
7

Nella scrittura in lattice, di solito c'è un file di bibliografia, che a volte contiene _, & o $. Ad esempio, il nome del diario "Nature Structural & Molecular Biology", il titolo dell'articolo "Stima del costo del nuovo sviluppo di farmaci: è davvero 802 milioni di dollari?" E il numero del volume "suppl_2".

Quindi ho bisogno di convertire questi simboli in \_, \& e \$ rispettivamente, ad esempio aggiungendo una barra rovesciata davanti, in modo che il compilatore di latex possa identificarli correttamente. Voglio usare sed per fare la conversione. Così ho provato

sed 's/_/\_/' <bib.txt >new.txt 

ma il file new.txt generato è esattamente lo stesso di bib.txt. Ho pensato _ e \ aveva bisogno di essere sfuggito, così ho provato

sed 's/\_/\\\_/' <bib.txt >new.txt 

ma nessuna speranza neanche. Qualcuno può aiutare? Grazie.

+0

Le mie scuse, ho letto male come stavo modificando. – rcollyer

+1

Se alcuni di questi caratteri sono già stati preceduti da escape, la tua espressione regolare dovrà controllare che il carattere precedente non sia un '\'. –

risposta

12

Si verificano alcune difficoltà a causa del modo in cui la shell gestisce le stringhe. La barra rovesciata deve essere raddoppiata:

sed 's/_/\\_/g' 

Nota che ho anche aggiunto un 'g' per indicare che la sostituzione deve applicare a livello globale sulle linee, non solo per la prima partita.

per gestire tutti i tre simboli, utilizzare una classe di caratteri:

sed 's/[_&$]/\\&/g' 

(. La e commerciale nel testo di sostituzione è un carattere speciale riferimento al testo corrispondente, non un carattere di e commerciale letterale)

+0

Grazie. Anche questo funziona. –

1

È necessario sfuggire al numero \. Così: sed 's/_/\\_/' new.txt.

Edit: Inoltre, per modificare new.txt in atto, è necessario passare sed bandiera -i:

sed -iBAK 's/_/\\_/' new.txt

1

Hai bisogno di fuggire due volte.

➜ 8080667 sed 's/_/\\_/' new.txt 
In writing latex, usually there is a bibliography file, which sometimes contains \_, &, or $. For example, the journal name "Nature Structural & Molecular Biology", the article title "Estimating The Cost Of New Drug Development: Is It Really $802 Million?", and the volume number "suppl_2". 
➜ 8080667 
3
sed 's/\([_&$]\)/\\\1/g' 

ad es.

eu-we1:~/tmp# cat zzz 
bla__h&thisis&not the $$end 
eu-we1:~/tmp# sed 's/\([_&$]\)/\\\1/g' < zzz 
bla\_\_h\&thisis\&not the \$\$end 
eu-we1:~/tmp# 
+0

e non fare sedute sedute, non si sa mai. do sed 's/\ ([_ & $] \)/\\\ 1/g' < src.tex > dst.tex – user237419

+0

Grazie mille. Funziona veramente. –

+0

siete i benvenuti :) – user237419

Problemi correlati