Ich habe viele Dateien mit Tabs, die überall verstreut sind, und ich möchte sie alle in Leerzeichen konvertieren. Ich kenne den expand
Befehl, aber leider müsste ich jede einzelne Datei damit eingeben. Gibt es eine einfachere Möglichkeit, dies unter Linux zu tun?
linux
text-editing
Person
quelle
quelle
expand
ich davon aus, dass die Ausrichtung des Textes erhalten bleiben soll.'s/\t/ /g'
mehr als nur eine Registerkarte pro Zeile ersetzen.find ./ -type f -exec sed -i ’s/\t/ /g’ {} +
" ( dh "+
" anstelle von "\;
"), wenn diefind
Version dies unterstützt (und ich persönlich habe keine Version getroffen, die dies nicht tut, aber es ist kein POSIX-Standard Ich denke, es könnte auf einigen Systemen passieren. Siehe "-exec command {} +
" im Handbuch). Anstatt eine Instanz vonsed
für jede Datei zu starten , wird eine Argumentliste mit so vielen Dateinamenargumenten erstellt, wie das System unterstützt (getconf ARG_MAX
= 2097152 auf meinem System)xargs
, und damit viel wenigersed
Prozesse gestartet .sed
versteht die\t
Tab-Escape-Sequenz nicht. Sie können es durch ein wörtliches Tabulatorzeichen ersetzen, das Sie in die Shell eingeben können[Ctrl]+V, [Tab]
.expand
ist wahrscheinlich besser alssed
dafür, wie erklärt in: stackoverflow.com/a/11094620/131824Es gibt viele Möglichkeiten, dies zu tun. Es gibt auch viele Möglichkeiten, sich dabei in den Fuß zu schießen, wenn Sie nicht vorsichtig sind oder wenn Sie Linux noch nicht kennen, wie es scheint. Angenommen, Sie können eine Liste von Dateien erstellen, die Sie konvertieren möchten, indem Sie entweder etwas wie
find
oder manuell mit einem Editor verwenden, und leiten Sie diese Liste einfach in die folgende Liste ein.Eine Möglichkeit, sich damit in den Fuß zu schießen, besteht darin, einen Tippfehler zu machen, damit Sie eine leere Datei mit allen von Ihnen angegebenen Dateinamen bearbeiten und dadurch den Inhalt aller Ihrer Dateien löschen. Seien Sie also vorsichtig und testen Sie alles, was Sie zuerst tun, an einem kleinen Satz von Dateien, die Sie gesichert haben.
quelle
mv
Bedingung vom Erfolg vonexpand
:expand ... && mv ...
expand -t 4
, die Tabulatoren auf 4 Leerzeichen zu erweitern. Diese Methode kann auch nachfolgende Zeilenumbrüche erstellen. Aber sonst funktioniert es.-I foo
Erstellt für jede Eingabezeile eine Vorlagenvariable foo, sodass Sie mehrmals auf die Eingabe verweisen können.-print0
und-0
weisen Sie beide Befehle an, \ 0 als Zeilentrennzeichen anstelle von SPACE zu verwenden, sodass dieser Befehl für Pfade mit Leerzeichen funktioniert.quelle
Nachteile:
Dateien, die größer als der Pipe-Puffer ( 64 KB ) sind, werden abgeschnitten
Vorteile:
Keine temporären Dateien
, die größer als der Pipe-Puffer sind, werden abgeschnitten
quelle
Das ist besser:
quelle
/tmp/e
denn wenn irgendetwas anderes diese Datei verwendet, wird dies sie durcheinander bringen. Zum Beispiel, wenn zwei Benutzer dies gleichzeitig verwenden möchten.Ich habe dieses Problem unter Berücksichtigung der folgenden Anforderungen ausprobiert:
Die letzte Anforderung war am schwierigsten zu erfüllen, da durch "Erweitern" die vorhandenen Dateien nicht geändert werden können.
Ich habe die folgende Lösung gefunden:
Hier ist eine Erklärung:
quelle