Mam dużo plików z kartami pełnymi w środku i chciałbym przekonwertować je wszystkie w spacje. Wiem o tym expand
poleceniu, ale niestety musiałbym wpisać każdy pojedynczy plik, używając go. Czy jest na to łatwiejszy sposób w Linuksie?
linux
text-editing
osoba
źródło
źródło
expand
, zakładam, że chce zachować wyrównanie tekstu.'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ślifind
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 jakxargs
, i tym samym uruchamia znacznie mniejsed
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/131824Jest 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.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.
źródło
mv
od powodzeniaexpand
: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.-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.źródło
Wady:
pliki większe niż rozmiar bufora potoku ( 64 KB ) zostają obcięte
Plusy:
żadne pliki tymczasowe
większe niż rozmiar bufora potoku nie są obcinane
źródło
To jest lepsze:
źródło
/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:
Oto kilka wyjaśnień:
źródło