Antworten:
Versuche Folgendes:
find ./ -type f -exec sed -i 's/\t/ /g' {} \;
Wenn Sie vier Leerzeichen möchten, versuchen Sie:
find ./ -type f -exec sed -i 's/\t/ /g' {} \;
's/\t/ /g'mehr als nur eine Registerkarte pro Zeile ersetzen.
find ./ -type f -exec sed -i ’s/\t/ /g’ {} +" ( dh " +" anstelle von " \;"), wenn die findVersion 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 von sedfü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 weniger sedProzesse gestartet .
sedversteht die \tTab-Escape-Sequenz nicht. Sie können es durch ein wörtliches Tabulatorzeichen ersetzen, das Sie in die Shell eingeben können [Ctrl]+V, [Tab].
Es 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 findoder manuell mit einem Editor verwenden, und leiten Sie diese Liste einfach in die folgende Liste ein.
while read file
do
expand "$file" > /tmp/expandtmp
mv /tmp/expandtmp "$file"
done
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.
mvBedingung vom Erfolg von expand:expand ... && mv ...
expand -t 4, die Tabulatoren auf 4 Leerzeichen zu erweitern. Diese Methode kann auch nachfolgende Zeilenumbrüche erstellen. Aber sonst funktioniert es.
find . -type f -iname "*.js" -print0 | xargs -0 -I foo tab2space foo foo
-I foo Erstellt für jede Eingabezeile eine Vorlagenvariable foo, sodass Sie mehrmals auf die Eingabe verweisen können.
-print0und -0weisen Sie beide Befehle an, \ 0 als Zeilentrennzeichen anstelle von SPACE zu verwenden, sodass dieser Befehl für Pfade mit Leerzeichen funktioniert.
Das ist besser:
find . -name *.java ! -type d -exec bash -c 'expand -t 4 "$0" > /tmp/e && mv /tmp/e "$0"' {} \;
/tmp/edenn 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:
find . -type f -regextype egrep -regex '.*\.(c|cpp|h|hpp)' -print0 | xargs -0 -n 1 -P 10 -IFILE bash -c ' ( echo "Processing FILE..." && expand -t 4 "FILE" > /tmp/expand.$$ && mv /tmp/expand.$$ "FILE" ) || exit 255'
Hier ist eine Erklärung:
expandich davon aus, dass die Ausrichtung des Textes erhalten bleiben soll.