Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
-
monox
- Beiträge: 16
- Registriert: 31.10.2006 23:52:55
Beitrag
von monox » 01.11.2006 00:22:40
Hallo zusammen!
Ich möchte mit diesem Script in anderen Textdateien (Ascii-text und UTF) gewisse Wörter abändern. Dies funktioniert soweit auch recht gut. Das Script ist im gleichen Verzeichnis wie die zu bearbeitenden Textdateien. Das Problem ist nur, dass ich dutzende von Wörtern habe, welche ich abändern möchte. Also eine ganze Liste, welche folgendermassen aussieht:
er sie
du ich
wir uns
... ...
usw.
Wir muss ich das Script nun abändern, damit er im for-loop jedes Mal in diese Liste geht und zwei neue Gegensatzpaare rausholt und in der sed-Konstruktion einbettet? So, dass ich nur noch eine sed-Konstruktion hätte und das ganze etwas ökonomischer gemacht wäre. Die Liste heisst bei mir übrigens testgegensatz. Ich hoffe es kann jemand mein Problem verstehen und mir helfen. Und fragt mich jetz bitte nicht, ob es ein Übersetzer werden soll oder was auch immer. Das ganze hat schon einen Sinn....
mfg
monox
Code: Alles auswählen
#!/bin/bash
echo "-----------------------------------------"
echo "------Willkommen zum Opposite Script-----"
echo "-----------------------------------------"
chmod 777 *
ls -l | file * | grep -v testgegensatz | grep -E '(ASCII|UTF)' | awk '{print $1}' > .Textdokumente
sed -i -re 's/://' .Textdokumente
n=$(wc -l < .Textdokumente)
Gesamtmenge=$(sed '1,${n}' .Textdokumente)
Umwandlung=$Gesamtmenge
for file in $Umwandlung
do
sed -i -re 's|\<er\>|sie|g' $file
sed -i -re 's|\<du\>|ich|g' $file
sed -i -re 's|\<wir\>|uns|g' $file
done
rm .Textdokumente
-
MOFFt
- Beiträge: 63
- Registriert: 06.04.2006 12:39:24
Beitrag
von MOFFt » 01.11.2006 09:48:27
Wenn ich richtig verstanden habe, gibt es ein Datei(Liste) testgegensatz, die du dann in etwa so gestalten könntest:
er;sie
du;ich
wir;uns
Im Skript selbst kannst du dann die Schleife so gestalten:
liste=/pfad/zu/testgegensatz
cat $liste | while read i
do
VON=$(echo $i | cut -f1 -d ";")
NACH=$(echo $i | cut -f2 -d ";")
sed -i -re 's|\<$VON\>|$NACH|g' $file
done
Nicht getestet, aber schon in eigenem Skript verwendet.
Linux is like a Wig-Wam: No Gates, No Windows, Apache inside
-
monox
- Beiträge: 16
- Registriert: 31.10.2006 23:52:55
Beitrag
von monox » 01.11.2006 10:10:32
hallo
mein code sieht nun so aus, gemäss deiner lösung:
Code: Alles auswählen
#!/bin/bash
echo "-----------------------------------------"
echo "------Willkommen zum Opposite Script-----"
echo "-----------------------------------------"
chmod 777 *
ls -l | file * | grep -v testgegensatz | grep -E '(ASCII|UTF)' | awk '{print $1}' > .Textdokumente
sed -i -re 's/://' .Textdokumente
n=$(wc -l < .Textdokumente)
Gesamtmenge=$(sed '1,${n}' .Textdokumente)
Umwandlung=$Gesamtmenge
liste=/home/corypho/testgegensatz
cat $liste | while read i
do
VON=$(echo $i | cut -f1 -d ";")
NACH=$(echo $i | cut -f2 -d ";")
sed -i -re 's|\<$VON\>|$NACH|g' $Umwandlung
echo $Umwandlung
done
rm .Textdokumente
wie genau meinst du in den loop einbinden?
So wie ich es nun gecoded habe hat es keine Wirkung.
Bitte um Hilfe....
-
MOFFt
- Beiträge: 63
- Registriert: 06.04.2006 12:39:24
Beitrag
von MOFFt » 01.11.2006 12:38:56
Nein - die Ansätze, die ich dir gegeben habe sollten "nur" die 3 sed-Zeilen ersetzen, alles andere sollte genau so funktionieren wie zuvor!?
Alles was ich mit meinem Beispiel zeigen wollte war:
Anstelle von zig Sed-Zeilen in deinem ersten Skript, kannst du eine extra Datei '/home/corypho/testgegensatz' gestalten in die du alle zu ersetzende Wörter einfügst (jeweils mit ';' getrennt)
Der 2. Skriptblock liest dann in einer Schleife die zwei Wörter (VOR-ersetzen; NACH-ersetzen) aus und handelt das ganze in EINEM Sed-Befehl ab.
Dh. Dein erstes Skript belassen und nur die 3 sed-Befehle entsprechend korrigieren -> stimmen die Klammern in deinem Sed-Befehl? ... 's|\<$VON\>|$NACH|g'
Hoffe jetzt ists klarer?
Linux is like a Wig-Wam: No Gates, No Windows, Apache inside
-
monox
- Beiträge: 16
- Registriert: 31.10.2006 23:52:55
Beitrag
von monox » 01.11.2006 13:12:31
hallo
vielen dank für deine prompte hilfe. ich habe nun die drei sed zeilen durch deinen code (while) ersetzt. das script führt sich ohne fehler aus, aber es passiert nichts. also die wörter werden in einem textfile nicht ersetzt. dies ist mir unerklärbar. ich habe auch alles gut gemacht, korrekte sed-zeichen und die richtigen trennzeichen in der tabelle mit den wörtern.
vielleicht kannst du das script mal kurz lokal testen und dir 1-2 testfiles anlegen.
Code: Alles auswählen
#!/bin/bash
echo "-----------------------------------------"
echo "------Willkommen zum Opposite Script-----"
echo "-----------------------------------------"
chmod 777 *
ls -l | file * | grep -v testgegensatz | grep -E '(ASCII|UTF)' | awk '{print $1}' > .Textdokumente
sed -i -re 's/://' .Textdokumente
n=$(wc -l < .Textdokumente)
Gesamtmenge=$(sed '1,${n}' .Textdokumente)
Umwandlung=$Gesamtmenge
echo $Umwandlung
for file in $Umwandlung
do
liste=/home/corypho/testgegensatz
cat $liste | while read i
do
VON=$(echo $i | cut -f1 -d ";")
NACH=$(echo $i | cut -f2 -d ";")
sed -i -re 's|\<$VON\>|$NACH|g' $file
done
done
rm .Textdokumente
-
MOFFt
- Beiträge: 63
- Registriert: 06.04.2006 12:39:24
Beitrag
von MOFFt » 01.11.2006 18:22:44
So - habs jetzt noch etwas umgeschrieben (hatte da beim sed-Befehl, bei Variablendefinition auch nen kleinen Fehler)
Folgende Dateien:
Testdatei01:
~/temp/opposite] cat datei01.txt
Text in dieser Datei soll ersetzt werden.
Ersetze er durch sie.
Ersetze du durch ich.
Ersetze wir durch uns.
Testdatei02 (Kopie von Testdatei01)
Das eigentliche Skript: (ausführbar)
~/temp/opposite] cat testgegensatz.sh
#!/bin/bash
echo "-----------------------------------------"
echo "------Willkommen zum Opposite Script-----"
echo "-----------------------------------------"
# chmod 777 *
ls -l | file * | grep -v testgegensatz | grep -E '(ASCII|UTF)' | awk '{print $1}' > .Textdokumente
sed -i -re 's/://' .Textdokumente
# n=$(wc -l < .Textdokumente)
# Gesamtmenge=$(sed '1,${n}' .Textdokumente)
# Umwandlung=$Gesamtmenge
for datei in $(cat ./.Textdokumente); do
cat ./testgegensatz.cfg | while read i
do
VON=$(echo $i | cut -f1 -d ";")
NACH=$(echo $i | cut -f2 -d ";")
cat $datei | sed 's/\<'$VON'\>/'$NACH'/g' > .tmp
mv .tmp $datei
done
done
rm .Textdokumente
Die beliebig erweiterbare Konfig-Datei:
~/temp/opposite] cat testgegensatz.cfg
er;sie
du;ich
wir;uns
Testlauf hat funktioniert - etwas Anpassung wäre noch nötig, wenn die zu ersetzenden Begriffe nicht in Klammern (<>) angeführt stehen, so wie ich meine!
Linux is like a Wig-Wam: No Gates, No Windows, Apache inside