2011-11-10 17 views
7

Al escribir látex, generalmente hay un archivo de bibliografía que a veces contiene _, & , o $. Por ejemplo, el nombre de la revista "Nature Structural & Molecular Biology", el título del artículo "Estimando el costo del desarrollo de nuevos fármacos: ¿Es realmente $ 802 millones?" Y el número de volumen "suppl_2".

por eso es necesario convertir estos símbolos en \_, \& y \$ respectivamente, es decir, la adición de una barra invertida delante, de modo que el compilador de látex puede identificarlos correctamente. Quiero usar sed para hacer la conversión. Así que probé

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

pero el new.txt generado es exactamente igual que bib.txt. Pensé _ y \ necesitaba ser escapado, así que traté

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

pero hay esperanza tampoco. ¿Alguien puede ayudar? Gracias.

+0

Mis disculpas, lo leí mal mientras editaba. – rcollyer

+1

Si ya ha escapado algunos de esos caracteres, su expresión regular deberá verificar que el carácter anterior no era un '\'. –

Respuesta

12

Te encuentras con algunas dificultades debido a la forma en que el caparazón maneja las cadenas. La barra invertida necesita ser duplicado:

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

Tenga en cuenta que también he añadido un 'g' para indicar que la sustitución debe aplicarse a nivel mundial en las líneas, no sólo para el primer partido.

de gestionar los tres símbolos, utilice una clase de caracteres:

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

(. El símbolo de unión en el texto de reemplazo es un carácter especial en referencia al texto coincidente, no un carácter de signo literal)

+0

Gracias. Esto también funciona –

1

Necesita escapar de su \. De esta manera: sed 's/_/\\_/' new.txt.

Editar: Además, para modificar nuevo.txt en su lugar, se necesita pasar sed la bandera -i:

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

1

tiene que escapar dos veces.

➜ 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' 

por ejemplo

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

y no uses seds in situ, nunca se sabe. do sed 's/\ ([_ & $] \)/\\\ 1/g' < src.tex > dst.tex – user237419

+0

Muchas gracias. Realmente funciona. –

+0

eres bienvenido :) – user237419

Cuestiones relacionadas