Mam skrajny problem, a wszystkie rozwiązania, które mogę sobie wyobrazić, są skomplikowane. Zgodnie z moim doświadczeniem w systemach UNIX / Linux musi istnieć łatwy sposób.
Chcę usunąć pierwsze 31 bajtów każdego pliku w /foo/
. Każdy plik jest wystarczająco długi. Cóż, jestem pewien, że ktoś dostarczy mi zaskakująco łatwe rozwiązanie, którego po prostu nie mogę sobie wyobrazić. Może awk?
text-processing
files
sed
awk
von der tann
źródło
źródło
Odpowiedzi:
lub szybciej, dzięki sugestii Gillesa:
Uwaga: Ogon Posix określa „-c +32” zamiast „+ 32c”, ale domyślny ogon Solaris nie lubi:
/usr/xpg4/bin/tail
jest w porządku z obiema składniami.źródło
dd
tutaj jest przesadą,tail
jest bardziej odpowiednie (prostsze, mniejsze ryzyko literówki zabójcy, brak fałszywych wiadomości na stderr).cut
(czy to nie powinien być ogon? ... asis, to nie działa dla mnie .../usr/xpg4/bin
wyprzedzić/usr/bin
swoją działalnośćPATH
, inaczej utkniesz na początku lat 90. Wiele unikatów (np. GNU, BusyBox) nie obsługuje już+32c
składni historycznej i oznacza to plik o nazwie+32c
(jak wymaga POSIX).Następujące polecenia wycinają pierwsze 31 bajtów
$file
(używając$file~
jako kopii tymczasowej):Musisz tylko wyświetlić listę lub
find
wszystkie pliki poniżej/foo/
i wykonać dwa powyższe dla każdego$file
znalezionego pliku .źródło
tail -c +32
wyprowadza dane wejściowe minus pierwsze 31 bajtów. (Tak, argument jest wyłączony o jeden). Aby edytować plik na miejscu, użyj gąbki w pętli, a jeśli go nie masz i nie chcesz się tym przejmować, wykonaj swoją pracę w powłoce:Jeśli polecenia zostaną przerwane z jakiegokolwiek powodu (np. Awaria zasilania), może być trudno ustalić, gdzie przerwałeś. Zapisanie nowych plików w osobnym katalogu ułatwiłoby to.
Jeśli pliki są naprawdę duże (na tyle duże, że problem stanowią dwie kopie nawet jednego), możesz skorzystać z jednej z technik wymienionych w tym wątku .
źródło
Możesz używać Vima w trybie Ex:
%
wybierz wszystkie linie!
Uruchom poleceniex
Zapisz i zamknijźródło