Hallo, ich bin Neuling im Bereich Shell/Terminal und bitte um Hilfe bei einem Problem. Kürzlich habe ich durch Internetrecherche ein ähnliches, aber etwas trivialeres Problem selber lösen können, bin jetzt aber an meine Grenzen geraten.
Die Aufgabe:
Eine Reihe von .txt Dateien sind in ein PHP/MySQL basiertes Wiki zu übertragen, das heisst die Textdateien müssen konvertiert werden in Datenbanktabellen. Wahrscheinlich ist das letztlich nicht schwer, da ich hier wahrscheinlich mit find -exec sed arbeiten kann - falls meine bisherigen Überlegungen richtig sind.
Was mir bereits zur Verfügung steht:
1 | find . -name "*.txt" -exec sed -i 's/SUCHE/ERSETZE/g' {} \; |
Also finde im aktuellen Verzeichnis alle Dateien mit der Endung .txt, suche den REGEX "SUCHE" und ersetze ihn mit "ERSETZE"
Das 1. Problem:
Wenn ich die einzelnen Dateiinhalte so erweiterte, so dass ich die Datenbanktabellenfelder "um den Originaltext herum baue", dann fehlte mir noch der Eintrag des Wiki-Seitennamens in der Tabelle.
Diesen möchte ich nun aus dem Dateititel auslesen und an die richtige Stelle in die Datei "einbauen".
(Das mit der richtigen Stelle ist wahrscheinlich nicht das Problem, da ich ja mehrere Durchgänge mit find - exec sed so machen kann, dass ich erst einen Teil der Tabellenfelder, dann den Titel und dann den Rest einfüge)
→ Frage:
Wie kann ich den Dateinamen auslesen und in das Dokument vor den restlichen bestehenden Inhalt schreiben, der restliche inhalt bleibt aber gleich?
→ Beispiel:
meinedatei.txt Inhalt: blabla blubb
Befehl ausführen
Ergebnis:
meinedatei.txt Inhalt: meinedateiblabla blubb
Das 2. Problem: * falls sich dies nicht aus einer Antwort zu Problem 1 erledigt hat *
Bei meiner SUCHE/ERSETZEN möchte ich ja in jedem Durchgang den gesamten Dateiinhalt suchen - der ja jedesmal völlig unterschiedlich ist und diesem dann etwas vorneanstellen oder hinteananstellen. Ich brauche also als REGEX (oder so) eine Art Wildcard, die den gesamten Dateiinhalt bezeichnet
Mein bisheriger Ansatz:
1 | find . -name "*.txt" -exec sed -i 's/GESAMTER-DATEIINHAlT/PräfixGESAMTER-DATEIINHALT/g' {} \; |
Bzw.
1 | find . -name "*.txt" -exec sed -i 's/GESAMTER-DATEIINHAlT/DateinameGESAMTER-DATEIINHALT/g' {} \; |
Frage:
Bin ich da auf der richtigen Spur und wie muss ich das exakt formulieren?
Am Ende soll jede Datei folgendermaßen aussehen:
1 | "0","DATEINAME","90"," INHALT DER DATEI = INHALT DER WIKISEITE ",,"1330306980",,"12","1","Benutzername","00.00.000.000",,NULL,NULL,NULL,NULL,"0",NULL,"admin","3239","de",,"0","1330257065","n",,NULL,NULL |
Variieren tun dabei nur das zweite und das vierte Feld - die Kommas , trennen die Felder und die Anführungszeichen " begrenzen die Felder.
Und noch eine Sache zum Schluss:
Am Ende muss ich noch alle Dateien zu einer Datei zusammenführen.
Das heißt ich muss alle .txt Dateien "finden" und deren Inhalt in die jeweils nächste Zeile einer anderen Datei schreiben.
Diese Datei kann zu Beginn leer sein und die Endung .csv haben (z.B. meinergebnis.csv) und damit im gleichen Verzeichnis liegen wie die .txt Dateien.
→ Frage:
wie kann ich aus allen .txt den Inhalt auslesen und in die .csv hineinschreiben, bzw. an den dortigen Inhalt jeweils hinten dranhängen?
Die sich ergebende Datei meinergebnis.csv wäre dann bereits die Datenbanktabelle, die ich via PHPmyAdmin in die bestehende Datenbank importieren kann.
Jetzt wären alle im Laufe der Zeit mal als Notizen angelegten .txt Dateien als Wikiseiten ins System importiert.
Entschuldigt bitte meine Unkenntnis im Detail - das alles herauszufinden und das erste Problem von neulich zu lösen hat schon ein paar Tage gedauert. Ich wäre über Eure Hilfe sehr erfreut.
Dank und Gruß Torsten