2011-11-10 21 views
7

Pisząc lateks, zwykle znajduje się plik bibliografii, który czasami zawiera _, & lub $. Na przykład nazwa czasopisma "Nature Structural & Molecular Biology", tytuł artykułu "Szacowanie kosztów nowego rozwoju leków: czy to naprawdę 802 miliony dolarów?" I numer woluminu "suppl_2".

Więc trzeba konwertować te symbole do \_, \& i \$ odpowiednio, czyli dodając odwrotny ukośnik z przodu, tak że lateks kompilator może poprawnie zidentyfikować. Chcę użyć sed do konwersji. Więc próbowałem

, ale wygenerowany plik new.txt jest dokładnie taki sam jak plik bib.txt. Myślałem _ i \ potrzebne do uciekł, więc próbowałem

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

ale żadnej nadziei albo. Czy ktoś może pomóc? Dzięki.

+0

Przepraszam, źle odczytałem to, co edytowałem. – rcollyer

+1

Jeśli masz już niektóre z tych znaków, które uciekły, wtedy twoje wyrażenie regularne będzie musiało sprawdzić, czy poprzedni znak nie był "\". –

Odpowiedz

12

Występują pewne trudności ze względu na sposób, w jaki powłoka obsługuje ciągi. Odwrotny ukośnik musi być podwojona:

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

Zauważ, że ja również dodaje „g”, aby wskazać, że wymiana powinna globalnie stosowane na liniach, a nie tylko do pierwszego meczu.

Aby obsługiwać wszystkie trzy symbole, użyj klasę postaci:

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

(. Znak & w tekście zastępującym jest specjalny znak odnoszący się do dopasowanego tekstu, a nie dosłowny znak ampersand)

+0

Dzięki. To też działa. –

1

Musisz uciec przed swoim \. W ten sposób: sed 's/_/\\_/' new.txt.

Edycja: Również zmodyfikować new.txt w miejscu, trzeba przekazać sed flagę -i:

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

1

Musisz uciec go dwukrotnie.

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

np.

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

i nie rób wewnętrznych seds, nigdy nie wiesz. do sed 's/\ ([_ & $] \)/\\\ 1/g' < src.tex > dst.tex – user237419

+0

Wielkie dzięki. To naprawdę działa. –

+0

serdecznie zapraszamy :) – user237419

Powiązane problemy