humanoid1
Anmeldungsdatum: 15. März 2022
Beiträge: 41
Wohnort: Jena
|
Na hoffentlich ist der Titel richtig gewählt.
Guten Tag an die Ubuntu-Gemeinschaft. Bei meinen Script für die Änderung in Office-Dokumenten bin ich leider noch nicht am Ende. In einem Verzeichnis liegen die Dateien sed-test1.odt, sed-test2.odt bis sed-test10.odt.
Wir haben eine gemeinsame Lösung gefunden für die Abarbeitung einer einzelnen xml-Datei.
Nun wollte ich mit wildcards das auf alle Dateien reproduzieren, doch das klappt nicht.
Dabei dachte ich, alles richtig gemacht zu haben. | #!/bin/sh
et1=odt
et2=xml
unzip /home/user1/Schreibtisch/sed-test/*.$et1 -d /home/user1/zip/sed-test/
cd /home/user1/zip/sed-test/
sed -i '/<text:p/,/<\/text:p>/s/HAUS/Wand/g; s/Mäuse/Vögel/g; s|Musterfrau|Models |g' content.$et2
cd /home/user1/zip/sed-test
zip /home/user1/zip/*_neu.$et1 -rm *
|
Vielen Dank im Voraus für eure Zeit. Bearbeitet von rklm: Syntaxhighlighting. Bitte beachte Forum/Syntax und nutze die Vorschaufunktion!
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17622
Wohnort: Berlin
|
Was heißt "klappt nicht"? Raucht der Rechner ab? Tut sich gar nichts? Werden die Dateien nicht ausgepackt? Überschreiben sie sich gegenseitig? Zeigt sed keine Wirkung? Zeigt es nur sporadisch Wirkung? Permission denied? No space left on device? ...
|
humanoid1
(Themenstarter)
Anmeldungsdatum: 15. März 2022
Beiträge: 41
Wohnort: Jena
|
Super-Reaktion ☺))
Also, wenn ich eine Datei spezifisch angebe, funktioniert es. Doch bei Angabe von den *-Platzhaltern passiert keine Reaktion.
|
humanoid1
(Themenstarter)
Anmeldungsdatum: 15. März 2022
Beiträge: 41
Wohnort: Jena
|
Das ist die Ausgabe:
$ /home/user1/Schreibtisch/sed-replace3.sh
Archive: /home/user1/Schreibtisch/sed-test/sed-test10.odt
caution: filename not matched: /home/user1/Schreibtisch/sed-test/sed-test1.odt
caution: filename not matched: /home/user1/Schreibtisch/sed-test/sed-test2.odt
caution: filename not matched: /home/user1/Schreibtisch/sed-test/sed-test3.odt
caution: filename not matched: /home/user1/Schreibtisch/sed-test/sed-test4.odt
caution: filename not matched: /home/user1/Schreibtisch/sed-test/sed-test5.odt
caution: filename not matched: /home/user1/Schreibtisch/sed-test/sed-test6.odt
caution: filename not matched: /home/user1/Schreibtisch/sed-test/sed-test7.odt
caution: filename not matched: /home/user1/Schreibtisch/sed-test/sed-test8.odt
caution: filename not matched: /home/user1/Schreibtisch/sed-test/sed-test9.odt
caution: filename not matched: /home/user1/Schreibtisch/sed-test/sed-test.odt
sed: content.xml kann nicht gelesen werden: Datei oder Verzeichnis nicht gefunden
zip warning: name not matched: *
zip error: Nothing to do! (try: zip -rm /home/user1/zip/*_neu.odt . -i *)
|
humanoid1
(Themenstarter)
Anmeldungsdatum: 15. März 2022
Beiträge: 41
Wohnort: Jena
|
"zip warning: name not matched: *"
Doch wie kann ich anders angeben, dass es sich um mehrere Dateien handelt?
|
Doc_Symbiosis
Anmeldungsdatum: 11. Oktober 2006
Beiträge: 4453
Wohnort: Göttingen
|
Ich würde das wohl mit einer for-Anweisung machen und das cd aber an den Anfang packen: pushd
cd /home/user1/zip/sed-test/
for file in *.odt; do
echo fuehre Kommandos mit Datei "$file" aus;
done
popd
|
humanoid1
(Themenstarter)
Anmeldungsdatum: 15. März 2022
Beiträge: 41
Wohnort: Jena
|
Das mit dem pushd gefällt mir sehr, dass das gesamte Verzeichnis eingelesen werden kann!
Nur hane ich das möglicherweise fehlerhaft umgesetzt. Denn es ist kein Ergebnis vorhanden.
| #!/bin/sh
et1=odt
et2=xml
pushd
cd /home/user1/zip/sed-test/
for file in *.odt; do
echo "unzip /home/user1/Schreibtisch/sed-test/*.$et1 -d /home/user1/zip/sed-test/
sed -i '/<text:p/,/<\/text:p>/s/HAUS/Wand/g; s/Mäuse/Vögel/g; s|Musterfrau|Models |g' content.$et2
zip /home/user1/zip/*_neu.$et1 -rm *";
done
popd
|
Auszug von der Ausgabe.
/home/user1/Schreibtisch/sed-replace4.sh: Zeile 12: popd: Der Verzeichnisstapel ist leer.
/home/user1/Schreibtisch/sed-replace4.sh: Zeile 19: $'\nxmlstarlet select edit \\\n Bearbeitet von rklm: Syntaxhighlighting. Bitte beachte Forum/Syntax und nutze die Vorschaufunktion!
|
Doc_Symbiosis
Anmeldungsdatum: 11. Oktober 2006
Beiträge: 4453
Wohnort: Göttingen
|
Ach, das hatte ich falsch im Kopf. So muss das wohl mit pushd heissen:
pushd $(pwd)
Und das echo brauchst Du bei Dir natürlich nicht, das war nur kurzer Beispielcode...
|
humanoid1
(Themenstarter)
Anmeldungsdatum: 15. März 2022
Beiträge: 41
Wohnort: Jena
|
Danke an Doc_Symbiosis, aber ich mache irgendetwas falsch.
@ rkml Die Vorschaufunktion suche ich noch, wenn gefunden, wird diese sofort genutzt.
| #!/bin/sh
et1=odt
et2=xml
cd /home/user1/zip/sed-test/
pushd $(pwd)
for file in *.odt; do
unzip /home/user1/Schreibtisch/sed-test/*.$et1 -d /home/user1/zip/sed-test/
sed -i '/<text:p/,/<\/text:p>/s/HAUS/Wand/g; s/Mäuse/Vögel/g; s|Musterfrau|Models |g' content.$et2
zip /home/user1/zip/*_neu.$et1 -rm *;
done
popd
|
Ausgabe:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 | /home/user1/Schreibtisch/sed-replace4.sh
~/zip/sed-test ~/zip/sed-test
Archive: /home/user1/Schreibtisch/sed-test/sed-test10.odt
caution: filename not matched: /home/user1/Schreibtisch/sed-test/sed-test1.odt
caution: filename not matched: /home/user1/Schreibtisch/sed-test/sed-test2.odt
caution: filename not matched: /home/user1/Schreibtisch/sed-test/sed-test3.odt
caution: filename not matched: /home/user1/Schreibtisch/sed-test/sed-test4.odt
caution: filename not matched: /home/user1/Schreibtisch/sed-test/sed-test5.odt
caution: filename not matched: /home/user1/Schreibtisch/sed-test/sed-test6.odt
caution: filename not matched: /home/user1/Schreibtisch/sed-test/sed-test7.odt
caution: filename not matched: /home/user1/Schreibtisch/sed-test/sed-test8.odt
caution: filename not matched: /home/user1/Schreibtisch/sed-test/sed-test9.odt
caution: filename not matched: /home/user1/Schreibtisch/sed-test/sed-test.odt
sed: content.xml kann nicht gelesen werden: Datei oder Verzeichnis nicht gefunden
zip warning: name not matched: *
zip error: Nothing to do! (try: zip -rm /home/user1/zip/*_neu.odt . -i *)
~/zip/sed-test
/home/user1/Schreibtisch/sed-replace4.sh: Zeile 20: $'\nxmlstarlet select edit \\\n --update "HAUS" \\\n --value Wand \\\n --update "Mäuse" \\\n --value Vögel content.xml\n': Kommando nicht gefunden.
|
|
humanoid1
(Themenstarter)
Anmeldungsdatum: 15. März 2022
Beiträge: 41
Wohnort: Jena
|
Ach, der Pfad war Falsch, aber geht immer noch nicht, schade. Ich erkenne den Fehler nicht.
| #!/bin/sh
et1=odt
et2=xml
cd /home/user1/Schreibtisch/sed-test
pushd $(pwd)
for file in *.odt; do
unzip /home/user1/Schreibtisch/sed-test/*.$et1 -d /home/user1/zip/sed-test/
sed -i '/<text:p/,/<\/text:p>/s/HAUS/Wand/g; s/Mäuse/Vögel/g; s|Musterfrau|Models |g' content.$et2
zip /home/user1/zip/*_neu.$et1 -rm *;
done
popd
|
|
fleet_street
Top-Wikiautor
Anmeldungsdatum: 30. August 2016
Beiträge: 2400
Wohnort: Hunsrück (dunkle Seite)
|
Es ergibt herzlich wenig Sinn eine Schleife der Art „Für jeder Datei aus der Liste xxx mache“ aufzurufen und dann die Variable Datei innerhalb der Schleife gar nicht zu verwenden. Das müsste doch eher heißen:
…
for file in *.odt; do
unzip "$file" -d /home/user1/zip/sed-test/
…
Bleibt das Problem, was man hinter mit dem zip einträgt. *Mmh*
|
humanoid1
(Themenstarter)
Anmeldungsdatum: 15. März 2022
Beiträge: 41
Wohnort: Jena
|
Das stimmt, "fleet_street"! Nun werden die Dateien gefunden. Es finden aber keine Ersetzungen statt und es soll jedesmal die vorhandene Datei überschrieben werden, obwohl diese nummeriert sind.
| #!/bin/bash
et1=odt
et2=xml
cd /home/user1/Schreibtisch/sed-test/
pushd $(pwd)
for file in *.odt; do
unzip "$file" -d /home/user1/zip/sed-test/
sed -i '/<text:p/,/<\/text:p>/s/HAUS/Wand/g; s/Mäuse/Vögel/g; s|Musterfrau|Models |g' content.$et2
zip /home/user1/zip/*_neu.$et1
done
popd
|
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 13213
|
Doc_Symbiosis schrieb:
pushd $(pwd)
Es ist allein schon fragwürdig, aber in den Skripten hier wird gar nicht das Verzeichnis gewechselt. Was soll das bezwecken? Mindestens fehlt da ein cd irgendwo im Skript scheint mir. Ich würde das grob so angehen: 1
2
3
4
5
6
7
8
9
10
11
12
13 | #!/bin/sh
set -e
dir=$(mktemp -d)
for zip; do
unzip "$zip" -d "$dir"
sed -i '/<text:p/,/<\/text:p>/s/HAUS/Wand/g; s/Mäuse/Vögel/g; s|Musterfrau|Models |g' "$dir/content.xml"
f=$(realpath "$zip")
( cd "$dir"; zip -r "${f%.*}_neu.zip" -m . )
done
|
Anmerkungen
Lieber die Dateinamen übergeben lassen anstatt das Skript das Globben machen zu lassen. Das ist flexibler. Man muss im Skript gar nicht das Verzeichnis wechseln soweit ich das sehe. Und wenn, dann kann man das oft mit einer Subshell erledigen: ( cd p/a/th && tu was ) . Einrückung hilft der Lesbarkeit. Man braucht keine bash .
|
humanoid1
(Themenstarter)
Anmeldungsdatum: 15. März 2022
Beiträge: 41
Wohnort: Jena
|
Liebes rkml, danke für diese professionelle Hilfe.
Ich habe nun den Eindruck, dass ich ein Shell-Idiot bin. Die letzten Zeilen Deines Vorschlages kann ich nicht mehr nachvollziehen. Ja, mir sind die Verzeichnisse eben auch unwichtig, es ging mir um die Stabelverarbeitung als Hilfe für eine solche Ersetzungsroutine.
Das Script von Dir habe ich im Verzeichnis der 10 Dateien ausgeführt und es kam die Meldung "Zeile 13: Syntaxfehler: Unerwartetes Dateiende."
Erst dachte ich, so ein Script könnte mir helfen etwas zu automatisieren um später selbständig andere Dinge zu scripten und nun fühle ich mich als Depp.
Mein 500 Seiten Buch über Shellscripting half mir auch nicht weiter, es ist wie ein toter Punkt. Danke für Eure Unterstützung.
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 13213
|
humanoid1 schrieb: Liebes rkml, danke für diese professionelle Hilfe.
Bitte.
Ich habe nun den Eindruck, dass ich ein Shell-Idiot bin. Die letzten Zeilen Deines Vorschlages kann ich nicht mehr nachvollziehen.
Du meinst sicherlich Zeile 12 und nicht 13, oder? Also, wir sprechen über diesen Teil: | f=$(realpath "$zip")
( cd "$dir"; zip -r "${f%.*}_neu.zip" -m . )
|
Was passiert da? Es wird der absolute Pfad der aktuell verarbeiteten Datei ermittelt. Dann wird eine Subshell gestarted und dann in dieser: Das Verzeichnis wird dorthin gewechselt, wo wir das Archiv / Dokument ausgepackt haben. Diese Änderung bleibt auf die Subshell beschränkt! Dann wird das aktuelle Verzeichnis inklusive Unterverzeichnissen in eine neue Datei gepackt (da muss ich übrigens noch etwas verbessern, damit die ursprüngliche Erweiterung erhalten bleibt, s.u.). Schließlich wird alles gelöscht, was ins Archive gepackt wurde (Option -m).
Nach dem Ende der Subshell ist das aktuelle Arbeitsverzeichnis der Shell, die das Skript ausführt, immer noch unverändert.
Änderung um die Erweiterung zu erhalten: | f=$(realpath "$zip")
( cd "$dir"; zip -r "${f%.*}_neu.${f##*.}" -m . )
|
Das Script von Dir habe ich im Verzeichnis der 10 Dateien ausgeführt und es kam die Meldung "Zeile 13: Syntaxfehler: Unerwartetes Dateiende."
Bei mir nicht. Copy & Paste-Fehler? Ggf. mal mit der Shell-Option -x ausführen. Dann siehst Du, was genau ausgeführt wird. Möglicherweise findest Du dann den Fehler.
Erst dachte ich, so ein Script könnte mir helfen etwas zu automatisieren um später selbständig andere Dinge zu scripten und nun fühle ich mich als Depp.
Ist ja keine Schande, etwas nicht zu wissen. Lernen ist doch spannend!
Mein 500 Seiten Buch über Shellscripting half mir auch nicht weiter, es ist wie ein toter Punkt.
Vielleicht hast Du dann eine nicht so gute Quelle.
Danke für Eure Unterstützung.
Bitte.
|