2010-01-03

Usuwanie komentarzy z plików TeX za pomocą programu sed

Ostatnio miałem dość duży plik LaTeX-a z mnóstwem komentarzy które musiałem usunąć. Usunięcie komentarzy ręcznie wprawdzie jeszcze wchodziło w grę (w końcu plik miał tylko ponad 2000 linii, z czego - jak się później okazało - połowa to były komentarze), ale poszperałem tu i ówdzie i postanowiłem zaprząść do pracy program sed. Problem nie był wcale taki prosty jak mi się na początku wydawało (biorąc pod uwagę różne możliwe ułożenia znaku % w kodzie i różne jego znaczenia), ale w końcu chyba udało mi się go kompletnie rozwiązać.

Dla potrzebujących prezentuję kod (zapisany w skrypcie o nazwie delcom.sed):

/^%/d
s/\\\\\\%/\\\\\\@#per#@/g
s/\\\\%.*/\\\\/g
s/\\\\%*/\\\\/g
s/\\%/\\@#per#@/g
s/%.*$//g
s/%*$//g
s/\\@#per#@/\\%/g


Skrypt taki uruchamiamy poleceniem
sed -f delcom.sed plik1.tex > plik2.tex

Dla ciekawskich omówię poszczególne linie skryptu. Linia pierwsza usuwa komentarze zaczynające się na początku wiersza (to była najprostsza część konstruowania skryptu). Linia druga zabezpiecza sekwencje znaków \\\% (czyli przejście do nowej linii i znak procenta) zamieniając w kodzie LaTeX-a znak % na trudną do uzyskania w normalnym tekście sekwencję znaków @#per#@. Linia trzecia i czwarta usuwają komentarze które zaczynają się tuż za znakiem \\ (tzn. sekwencja znaków \\%), komentarze odpowiednio z co najmniej jednym znakiem oraz komentarze puste. Linia piąta, podobnie jak linia druga, zabezpiecza znak procenta który ma się ukazać w tekście (zamienia \% na \@#per#@). Linie szósta i siódma usuwają komentarze zaczynające się od znaku % i idące do końca linii (j.w. - komentarze z co najmniej jednym znakiem i komentarze puste). Linia ósma odbezpiecza znaki procenta które nie były komentarzami i miały ukazać się w tekście.

Jak na razie skrypt sprawdza się. I oby było tak zawsze.