2013-01-20 32 views
7
I (yukarıdaki kuralı yüksek önceliğe sahiptir) Bir başka deyişle

herhangi parantezler ayraç veya bağ varsa ters eğik çizgi

\right) -> remain unchanged 
\right) -> remain unchanged 
\right] -> remain unchanged 
\right ] -> remain unchanged 
\right} -> remain unchanged 
\right } -> remain unchanged 
\ri)  -> \right) 
\ri  -> \rightarrow 
\right -> \rightarrow 

aşağıdaki kalıpları için değiştirmek yapmak istiyorum

ile dize deseni değiştirmek sed kullanmak nasıl, ben \ right, sahip olmak istiyorum, başka bir şey varsa, \ rightarrow ile değiştirilmelidir. Kısacası, çok sayıda kısa yollu Google Doküman denklemini uygun LaTeX biçimine dönüştürmeyi deniyordum. Ne ile geldi beklendiği gibi \ rightarrow \ içine \ sağ \ değişmez dışında Tamam çalışır aşağıdaki

sed -i 's/\\ri\([^g]\)/\\right\1/g' $tempfile1 #first step substitution 
sed -i 's/\\right\([^])}>|a]\)/\\rightarrow\1/g' $tempfile1 
sed -i 's/\\right \([^])}>|a]\)/\\rightarrow \1/g' $tempfile1 

oldu. Testim giriş tempfile1 \ sağ \ parçası doğru yapılırsa olmadığını kaydeden

\rightarrow\right\rightarrow \right)\right]\right }\right)\rightarrow \right ]\rightarrow \alpha \\ 

içine O gider şu

\ri\right\right \right)\right]\right }\right)\ri \right ]\righta \al \\ 

olduğunu. peşin ...

sed -i 's/\\right\\/\\rightarrow\\/g' $tempfile1 #why this does not work 

Çok teşekkürler Sonra o açık beklendiği gibi kalanları, ancak çalışmıyor gelip alacak düşüncesiyle aşağıdaki satırı eklendi ve şimdi gerçekten karıştı!

sed -i 's/\\right\([^])}>|a]\)/\\rightarrow\1/g' 

uygulanır: sentezleme zaman

+0

Benim için çalıştı. – aragaer

+0

Şüphesiz 3 scriptinizi 'sed -i -e '... pattern1 ...' -e '... pattern2 ...' -e '... pattern3 ...' kullanarak birleştirebilirsiniz. .'. Kilobayt boyutlu dosyalar için, üç geçiş muhtemelen büyük bir önem taşımaz, ancak çoklu-megabaytlı dosyalar ve daha büyük olanı için, üçlü geçişin üçü büyük bir fark yaratabilir. –

+0

Görüyorum, thx. Benim için tipik dosya boyutu 50 K'den az (normal LaTeX belgeleri), ancak değiştirmek için 30+ desenim var (ör. \ Al \ beta \ del \ b \ i \ sig) ve sayı zaman içinde artar. (Denklem Düzenleyicisi ve son “geliştirmeler” için google doc'a teşekkürler) – gamebm

cevap

3

bir sorun ortaya

\right\right\ 

birinci eşleşme \right\ okur ve \rightarrow\ ile değiştirir; Sorun taramayı sürdürdüğünde, ikinci right'un r başındaki ters eğik çizgi ile (önceki eşleşmenin bir parçasıydı) başlar.

basit hile tekrar initio ab başlatarak

sed -i -e 's/\\right\([^])}>|a]\)/\\rightarrow\1/g' \ 
     -e 's/\\right\([^])}>|a]\)/\\rightarrow\1/g' 

ikinci \right\ dizisi ile yeniden tarama fırsatlar ... komutu tekrarlamak.

+0

Açıklama için çok teşekkürler, şimdi daha iyi anladığımı düşünüyorum. Benim asıl sorunumda, aslında 30'dan fazla desenim var, bu yüzden tekrar tüm betiği tekrarlaman gerekecek. – gamebm

+1

Bu yeterince iyi çalışabilir. Alternatif olarak, "sed" yerine Perl veya Python'u kullanabilir ve desenlerde izleyen bağlamı kullanabilirsiniz, böylece "\ right \" içindeki ikinci ters eğik çizgi ilk eşleşmenin parçası değildir ve tekrar istediğiniz yerde devam eder. –

+0

Ben bu şeyleri çalışmak zorundayım, biliyorum sed çok satırlı belge manipüle iyi değil, bu yüzden onları düzgün bir şekilde tedavi edemiyorum, örneğin, bir kez bir \\ (double backslach) nokta ben eklemek gerekir \ n (endline) ve zaten varsa, bir sonraki satırın başında ve ek olarak.(\ alpha \\\ beta \ alpha \ n & \ beta'ya gider) Bu, denklem dizisinin düzgün hizalanması içindir. Biliyorum bunu kolayca kullanmalıyım, ama sed için çok şey var gibi görünüyor. – gamebm