Hilfe in Bash Script mit Liste

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
monox
Beiträge: 16
Registriert: 31.10.2006 23:52:55

Hilfe in Bash Script mit Liste

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



Benutzeravatar
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

antwort

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....

Benutzeravatar
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

antwort

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

Benutzeravatar
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

Antworten