Odpowiedzi:
Spróbuj wykonać następujące czynności:
find ./ -type f -exec sed -i 's/\t/ /g' {} \;
Jeśli chcesz cztery spacje, spróbuj:
find ./ -type f -exec sed -i 's/\t/ /g' {} \;
's/\t/ /g'zastąpić więcej niż jedną kartę w wierszu.
find ./ -type f -exec sed -i ’s/\t/ /g’ {} +” (to znaczy „ +” zamiast „ \;”), jeśli findwersja je obsługuje (a ja osobiście nie spotkałem żadnej wersji, która tego nie robi, ale nie jest to standard POSIX , więc myślę, że może się to zdarzyć na niektórych systemach. Patrz „ -exec command {} +” w instrukcji). Zamiast uruchamiać jedną instancję seddla każdego pliku, utworzy to listę argumentów z tyloma argumentami nazwy pliku, ile obsługuje system ( getconf ARG_MAX= 2097152 w moim systemie), podobnie jak xargs, i tym samym uruchamia znacznie mniej sedprocesów.
sednie rozumie \tsekwencji znaków zmiany znaczenia. Możesz go zastąpić dosłownym znakiem tabulacji, który możesz wprowadzić w powłoce [Ctrl]+V, [Tab].
expandjest prawdopodobnie lepszy niż seddo tego, jak wyjaśniono w: stackoverflow.com/a/11094620/131824
Jest na to wiele sposobów. Istnieje również wiele sposobów, aby strzelić sobie w stopę, robiąc to, jeśli nie jesteś ostrożny lub jesteś nowy w Linuksie, jak się wydaje. Zakładając, że możesz utworzyć listę plików, które chcesz przekonwertować, albo używając czegoś podobnego findlub ręcznie w edytorze, po prostu potokuj tę listę w następujący sposób.
while read file
do
expand "$file" > /tmp/expandtmp
mv /tmp/expandtmp "$file"
done
Jednym ze sposobów, w jaki możesz strzelić sobie w stopę, jest napisanie literówki, aby skończyć na pustym pliku dla wszystkich podanych nazw plików, usuwając w ten sposób zawartość wszystkich plików. Bądź więc ostrożny i przetestuj wszystko, co robisz najpierw, na małym zestawie plików, których kopię zapasową utworzono.
mvod powodzenia expand:expand ... && mv ...
expand -t 4rozwinąć tabulatorów do 4 spacji. Ponadto ta metoda może tworzyć końcowe znaki nowej linii. Ale poza tym to działa.
find . -type f -iname "*.js" -print0 | xargs -0 -I foo tab2space foo foo
-I foo tworzy szablonową zmienną foo dla każdej linii wejściowej, dzięki czemu można odwoływać się do danych wejściowych więcej niż jeden raz.
-print0i -0każ obu komendom używać \ 0 jako separatora linii zamiast SPACJI, więc to polecenie działa dla ścieżek ze spacjami.
To jest lepsze:
find . -name *.java ! -type d -exec bash -c 'expand -t 4 "$0" > /tmp/e && mv /tmp/e "$0"' {} \;
/tmp/eponieważ jeśli coś innego korzysta z tego pliku, to go zepsuje. Jak gdyby dwóch użytkowników chciało z tego korzystać jednocześnie.
Dałem temu problemowi uwagę, mając na uwadze następujące wymagania:
Ostatni wymóg był najtrudniejszy do spełnienia, ponieważ „rozwijanie” nie pozwala modyfikować plików w miejscu.
Wymyśliłem następujące rozwiązanie:
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'
Oto kilka wyjaśnień:
expand, zakładam, że chce zachować wyrównanie tekstu.