mikrocontroller.net

Forum: PC Hard- und Software In vielen Dateien Tabulatoren durch Leerzeichen ersetzen


Autor: Dicke Finger (dicke_finger)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe reichlich Projekte mit jeweils reichlich vielen (vhdl-)Dateien, 
in denen Tabulatoren zur Formatierung verwendet werden. Da diese in 
anderen Editoren durch die unterschiedliche Anzahl der Leerzeichen pro 
Tabulator immer total zerissen aussehen, suche ich nach einer 
Möglichkeit, in allen Dateien batch-artig alle Tabulatoren durch x 
Leerzeichen zu ersetzen.
Die Mühe, jede einzelne Datei zu öffnen und da dann alle zu ersetzen, 
möchte ich mir wirklich ungern machen, dafür sind es einfach zu viele 
Dateien.
Hat da jemand 'ne Idee oder weiß ein Programm, mit dem das gut geht?
Danke schonmal für alle Hinweise!

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jeder sinnvolle editor kann doch suchen und ersetzen. Wenn du tab suchst 
und durch Leerzeichen ersetzt sollte es doch gehen.

Autor: Backup (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
z.B. http://de.wikipedia.org/wiki/Vi

Wie war doch der Spruch: Mit einer Frau kann man eine Firma am schönsten 
ruinieren - mit einem Computer am SCHNELLSTEN?

Autor: roffez (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Für sowas nimmt man klassischerweise sed ("stream editor") aus dem 
Unix-Baukasten. Für Win guckst Du hier:
http://sourceforge.net/projects/unxutils/
Die Aufrufsyntax ist gewöhnungsbedürftig, aber dann gehts von selber ...

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Die Aufrufsyntax ist gewöhnungsbedürftig,

Nö, die Syntax ist doch ganz wie gewohnt, fast wie beim Vi ;-)

Etwas konstruktiver:
sed -i 's/\t/    /g' *.vhdl
Der Aufruf ersetzt in allen Dateien mit der Endung .vhdl die Tabs durch
jeweils 4 Leerzeichen

Autor: MeinerEiner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Notepad++ wäre auch ne Möglichkeit.

Autor: Tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich kann mich MeinerEiner nur anschließen, Notepad++ finde ich super für 
solche Formatierungsaufgaben.

Autor: Nitram L. (nitram)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
noch ein Vorschlag von mir: Textpad

nitraM

Autor: Dicke Finger (dicke_finger)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Liebe Editorvorschlager, ihr habt aber schon gelesen, dass ich eben 
NICHT jede Datei einzeln öffnen will, um dann den mir selbstverständlich 
seit geraumer Zeit bekannten Ersetzen-Dialog zu bemühen?

@yalu (oder andere sed-Experten):
Danke für die Syntax, das hat mir sehr geholfen. Wenn du mir jetzt noch 
sagst, dass und wie das auch in Unterordnern suchen kann, damit ich die 
Chose nicht auf jeden Ordner einzeln anwenden muss, bist du mein 
absoluter Held. Für mitlesende Windowser, der funktionierende Befehl 
unter Win32 lautet bisher: sed -i -e "s/\t/  /g" *.vhd

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Liebe Editorvorschlager, ihr habt aber schon gelesen, dass ich eben
> NICHT jede Datei einzeln öffnen will, um dann den mir selbstverständlich
> seit geraumer Zeit bekannten Ersetzen-Dialog zu bemühen?
richtige Editoren haben die möglichkeit "suchen und ersetzen in 
Dateien". Ultraedit z.b. es gibt davon auch eine Trail version.

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dicke Finger schrieb:
> Wenn du mir jetzt noch sagst, dass und wie das auch in Unterordnern
> suchen kann, damit ich die Chose nicht auf jeden Ordner einzeln
> anwenden muss, bist du mein absoluter Held.

Wer wollte nicht schon immer der absolute Held der Dicken Finger sein
;-)

Sicher ist in dem Paket, das den sed enthält, auch ein find mit
drin. Damit kannst du rekursiv nach allen Dateien mit bestimmten
Eigenschaften (in diesem Fall mit dem Namen *.vhd) suchen und auf jede
einen Befehl anwenden (in diesem Fall sed).

Die erste Variante sucht im aktuellen Verzeichnis und allen
Unterverzeichnissen:
find -name "*.vhd" -exec sed -i -e "s/\t/  /g" {} \;

Die zweite Variante sucht im Verzeichnis "basisverzeichnis" und allen
Unterverzeichnissen:
find basisverzeichnis -name "*.vhd" -exec sed -i -e "s/\t/  /g" {} \;

Autor: Dicke Finger (dicke_finger)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
find basisverzeichnis -name "*.vhd" -exec sed -i -e "s//\t/  /g" {} ;

Ohne das zusätzliche / beim Parameter s geht gar nichts, dafür ist das \ 
am Ende nicht notwendig. So läuft es auch erstmal an, Problem ist nur, 
dass da einige Verzeichnisse mit Leerzeichen drin sind, und die werden 
von sed anscheinend als Trennungszeichen interpretiert, das sucht dann 
also jeweils in den Teilen, die durch das Leerzeichen getrennt sind, und 
diese Verzeichnisse existieren natürlich nicht.
Dafür fällt es mir schwer, eine Lösung zu finden, da der Suchbegriff 
"find" anders als sed durchaus zahlreiche Ergebnisse liefert, die so gar 
nichts mit dem Linux-Befehl zu tun haben.
Hast du noch einen Tipp in der Hinterhand? ;)

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Problem ist nur,
> dass da einige Verzeichnisse mit Leerzeichen drin sind
einfach ein paar " verteilen.


find basisverzeichnis -name "*.vhd" -exec sed -i -e "s//\t/  /g" "{}" ;

oder

find basisverzeichnis -name "*.vhd" -exec sed -i -e "s//\t/  /g" \"{}\" 
;

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ganze Anführungszeichen- und Backslash-Gedöns ist Shell-abhängig und
wird von der Windows-Eingabeaufforderung anders gehandhabt als von einer
Unix-Shell. Falls die Vorschläge von Peter nicht helfen sollten, kannst
du versuchen, find und sed aus der in den UnxUntils enthaltenen Shell
(sh.exe) heraus zu starten.

Ich habe hier kein lauffähiges Windows, deswegen kann ich das nicht
testen. Das, was ich weiter oben geschrieben habe, funktioniert unter
Linux problemlos, auch bei Leerzeichen in Datei- und Verzeichnisnamen.

> find basisverzeichnis -name "*.vhd" -exec sed -i -e "s//\t/  /g" {} ;
>
> Ohne das zusätzliche / beim Parameter s geht gar nichts, dafür ist das
> \ am Ende nicht notwendig.

Das riecht irgendwie danach, dass das sed-Skript "s//\t/  /g" trotz der
Anführungszeichen in zwei Teile aufgespalten wird. Wenn das so ist, tut
der sed-befehl hinterher etwas ganz anderes. Aber auch hier sollte der
Aufruf aus der Shell helfen.

Autor: Da I (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Liebe Editorvorschlager, ihr habt aber schon gelesen, dass ich eben
> NICHT jede Datei einzeln öffnen will,

Wie schon gesagt wurde: Nimm Notepad++ (verwende ich auch, Top Teil), da 
geht das ohne Stress mit wenigen Mausklicks und ohne kryptische 
Kommandos

Autor: Thomas Pircher (tpircher) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmm, die ganzen sed-Varianten ueberzeugen mich nicht so recht, da ein 
tab nicht immer mit 3, 4 oder 8 Leerzeichen ersetzt werden muss, sondern 
abhaengig von der Spalte in der das Tab vorkommt.

Vim eignet sich gut, um solchen Tabs zu ersetzen. Notepad++ vielleicht 
auch, aber diesen Editor kenne ich nicht.

Unter Vim wuerde ich das so machen:

1) Anlegen einer Konfigurationsdatei fuer Vim (~/.vimrc unter Unix oder 
$HOME\_vimrc unter Windows) mit dem Inhalt
"tabs
set tabstop=4
set softtabstop=4
set shiftwidth=4
set expandtab

2) in jedem File ein ":%expandtab" ohne Gaensefuesschen eingeben.

Punkt 2) kann man auch automatisieren, z.B. mit einem Macro
:map <F2> :%expandTAB<ENTER>:wn<ENTER>
Jedesmal wenn man F2 drueckt, werden alle Tabs in der Datei expandiert, 
die Datei wird gespeichert und die naechste Datei geladen.

Nun muss nur noch Vim mit der Liste aller Dateien aufgerufen werden. 
Unter Linux wuerde ich folgendes machen:
find Verzeichnisname -name '*.vhd' | xargs vim

Autor: Thomas Pircher (tpircher) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, das Macro sollte so heissen (retab anstatt expandtab)
:map <F2> :%retab<ENTER>:wn<ENTER>

Autor: Bertram S. (bschall)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nimm jEdit...

Kann suchen und ersetzen bei allen Dateien innerhalb eines ordners... 
ohne lästiges öffnen...

Autor: Gerry E. (micky01)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich wollte ja schon gestern etwas sagen, habs aber dann mal lieber 
gelassen.

Die ganze Geschichte hängt doch wohl davon ab, welcher Tab-Abstand zum 
Zeitpunkt der Erstellung der Datei da war. Wenn sich einer sicher ist, 
immer denselben Abstand eingestellt zu haben, für den ist die 
Ruckzuckmethode mit find und sed optimal (UTF-8 sei mal nicht erwähnt).

Andernfalls muss man vor der Konvertierung wissen wie der Tab-Abstand in 
jeder einzelnen Datei war. Was sollte man denn da noch automatisieren?

Autor: Dicke Finger (dicke_finger)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, vielen Dank nochmal an alle Tippgeber, schlussendlich habe ich eine 
andere und recht einfache Möglichkeit gefunden, nämlich den TextCrawler.
Die Texteditormethode schlug bei mir zumindest mit Notepad++ fehl, da 
sich dies mit höherer Dateianzahl immer weiter aufblies und sich 
irgendwann selbst blockierte.
Der Tipp mit der Shell kam ein bisschen zu spät, aber ich werde dran 
denken, wenn ich mal andere solche Sachen machen muss, bei denen der 
TextCrawler vielleicht scheitert.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.