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 find
wersja 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ę sed
dla 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 sed
procesów.
sed
nie rozumie \t
sekwencji znaków zmiany znaczenia. Możesz go zastąpić dosłownym znakiem tabulacji, który możesz wprowadzić w powłoce [Ctrl]+V, [Tab]
.
expand
jest prawdopodobnie lepszy niż sed
do 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 find
lub 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.
mv
od powodzenia expand
:expand ... && mv ...
expand -t 4
rozwinąć 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.
-print0
i -0
każ 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/e
ponieważ 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.