2010-06-10 11 views
13

Mam całą masę plików w katalogu i z każdego pliku, który chcę usunąć pierwszy wiersz (łącznie z powrotem karetki). Czytam cały plik w tablicy łańcuchów i zapisuję wszystkie oprócz pierwszego elementu do nowego pliku, ale wydaje mi się to nieco kłopotliwe, czy istnieją lepsze sposoby? Och, preferowanym językiem jest Perl.Perl: Jak usunąć pierwszą linię pliku bez czytania i kopiowania całego pliku

+10

Jest to niemożliwe, ponieważ pliki są przechowywane. Zawsze będziesz musiał przeczytać cały plik i napisać wszystko oprócz pierwszej linii - system operacyjny nie ma innego wyjścia. – Konerak

Odpowiedz

23

Spróbuj jedną wkładkę

perl -pi -e '$_ = "" if ($. == 1);' filename 

znam go wcześniej, powinno być wszystko, czego potrzebujesz.

+0

+1 Nigdy nie trzeba przechowywać więcej niż jednej linii na raz. – mob

+0

możesz wyjaśnić, jak to działa? – FistOfFury

+0

zasadniczo mówi on o uruchomieniu perla, parsowaniu w miejscu i wykonaniu poniższego wiersza kodu. Następująca linia używa domyślnej zmiennej $ _, która w tym przypadku jest linią odczytywaną przez opcję -p. $. jest numerem linii nazwy pliku. więc jeśli numer wiersza wynosi == 1, ustaw tekst linii na "". –

5
use Tie::File qw(); 
for my $filename (glob 'some_where/some_files*') { 
    tie my @file, 'Tie::File', $filename or die "Could not open $filename: $!"; 
    shift @file; 
} 
+0

+1, tylko dla twojego PS. :) –

+1

Należy zauważyć, że to nadal musi przeczytać i skopiować cały plik, ale jest to związane z problemem. Nie znam żadnego systemu operacyjnego, który zapewnia inny sposób usuwania danych z początku pliku. – cjm

+0

Tie :: Plik jest moim oczywistym wyborem, ponieważ został wyraźnie napisany, aby skutecznie poradzić sobie z tą kategorią problemów. – daxim

9
perl -n -i -e 'print unless $. == 1' myfile 

Jest to podobne do odpowiedzi stocherilaca.

Ale w każdym przypadku (i we wszystkich innych udzielonych odpowiedziach!) Zawsze czytasz pełny plik. Nie można tego uniknąć, AFAIK.

+0

+1 to więcej niż jeden sposób zrobienia tego :) –

+0

+1 dla (IMHO) bardziej czytelnej wersji. –

+0

W Windows pod konsolą MinGW, który skasował mój plik "Nie mogę edytować w miejscu na moim pliku: Odmowa uprawnień" – user869097

11

Jak o

tail +2 

w skorupkach?

(edit: w nowszej Linux może trzeba tail -n +2 (dziękuję, GNU :()!)

9

OH język preferowana jest Perl

Czasami sed jest lepiej niż sed. nawet Perl:

sed -i 1d * 
-1

Jak podkreślił Schwern następujące robi nie wykonać wczesne wyjście, jak się początkowo wydawało, że będzie:

perl -pi -e '$_ = q// and last if $. == 1;' myFile 

Wydaje się jeden nie może unikać przetwarzania cały plik po wszystkim.

+4

To nie robi tego, co myślisz. Jeśli tak, to naruszyłoby sposób działania plików na systemie Unix. To, co się naprawdę dzieje, to '$ _ =" "' jest zawsze fałszywe, więc '$ _ =" "i last' jest takie samo jak' 0 i last'.To zwarcie i nigdy nie wywołuje "ostatniego". Napisałeś: 'perl -pi e '$ _ = q // jeśli $. == 1 'myFile', który jest sprytnym sposobem, aby nie drukować pierwszej linii, ale zdecydowanie odczytuje cały plik. Uruchom za pomocą '-MO = Deparse', aby uzyskać kod i uruchomić go w debugerze, aby zobaczyć. 'do {this; że; } jeśli coś jest bezpieczniejszą konstrukcją. – Schwern

+0

@ Schwern: Mój zły. Trwało to trochę czasu, zanim twoje wyjaśnienia dotarły do ​​ciebie, ale widzę twój punkt widzenia. – Zaid

Powiązane problemy