Hier ist meine Lösung mit awk
, dass ich denke, ist flexibler als sed
. Dieser prg. Verlässt die LaTeX-Befehle (wenn das Wort mit "\" beginnt) und behält die ersten Großbuchstaben der Wörter bei. Die Parameter von LaTeX-Befehlen (und normalen Texten) werden durch eine Wörterbuchdatei ersetzt. Wenn [rev] der dritte Parameter des Programms aktiviert ist, wird eine umgekehrte Substitution durch die gleiche Wörterbuchdatei durchgeführt. Alle Nicht-Alpha-Beta-Zeichen fungieren als Worttrennzeichen (dies ist in der LaTeX-Quelldatei erforderlich). Das Prg schreibt seine Ausgabe auf dem Bildschirm (stdout), so dass Sie die Umleitung zu Datei verwenden müssen (> output_f). (Ich glaube, die Inputencodierung Ihrer LaTeX-Quelle ist 1 Byte/char.
)
> cat dic.sh
#!/bin/bash
(($#<2))&& { echo "Usage $0 dictionary_file latex_file [rev]"; exit 1; }
((d= $#==3 ? 0:1))
awk -v d=$d '
BEGIN {cm=fx=0; fn="";}
fn!=FILENAME {fx++; fn=FILENAME;}
fx==1 {if(!NF)next; if(d)a[$1]=$2; else a[$2]=$1; next;} #read dict or rev dict file into an associative array
fx==2 { for(i=1; i<=length($0); i++)
{c=substr($0,i,1); #read characters from a given line of LaTeX source
if(cm){printf("%s",c); if(c~"[^A-Za-z0-9\\\]")cm=0;} #LaTeX command is occurred
else if(c~"[A-Za-z]")w=w c; else{pr(); printf("%s",c); if(c=="\\")cm=1;} #collect alpha-bets or handle them
}
pr(); printf("\n"); #handle collected last word in the line
}
function pr( s){ # print collected word or its substitution by dictionary and recreates first letter case
if(!length(w))return;
s=tolower(w);
if(!(s in a))printf("%s",w);
else printf("%s", s==w ? a[s] : toupper(substr(a[s],1,1)) substr(a[s],2));
w="";}
' $1 $2
Wörterbuch-Datei:
> cat dictionary
apple lemon
raspberry cherry
pear banana
Eingang LaTeX Quelle:
> cat src.txt
Apple123pear,apple "pear".
\Apple123pear{raspberry}{pear}[apple].
Raspberry12Apple,pear.
Execution Ergebnis:
> ./dic.sh
Usage ./dic.sh dictionary_file latex_file [rev]
> ./dic.sh dictionary src.txt >out1.txt; cat out1.txt
Lemon123banana,lemon "banana".
\Apple123pear{cherry}{banana}[lemon].
Cherry12Lemon,banana.
> ./dic.sh dictionary out1.txt >out2.txt rev; cat out2.txt
Apple123pear,apple "pear".
\Apple123pear{raspberry}{pear}[apple].
Raspberry12Apple,pear.
> diff src.txt out2.txt # they are identical
"Ersetzen" nicht den Job für Sie tun? –
Das Skript ist trivial. Die Daten jedoch ... Können Sie eine geeignete Liste von Substitutionen bereitstellen? –
Nun, ich könnte 'sed' oder' awk' verwenden, um jeden Fall separat zu ersetzen. Ich hatte gehofft, jemand hätte bereits eine Schleife oder ein Skript für häufige Fälle vorbereitet. In der Tat ist es eine andere Herausforderung, eine Liste gängiger Substitutionen zu finden. Wenn ich es selbst tun würde, würde ich es auf github einrichten, um es zu aktualisieren, wenn ich auf neue Fälle stoße. –