/ / Usuń ostatnią linię pliku za pomocą perl - perl, unix

Usuń ostatnią linię pliku, używając perl - perl, unix

sed "$d" $file;

Używanie tego polecenia nie działa, jak $ jest zarezerwowanym symbolem w Perlu.

Odpowiedzi:

5 dla odpowiedzi № 1

Nie wiem, dlaczego używasz sed w Perl. Sam Perl ma standardowy moduł do usunięcia ostatniej linii z pliku.

Użyj standardu (od wersji 5.8) Tie::File moduł i usuń ostatni element z powiązanej tablicy:

use Tie::File;

tie @lines, Tie::File, $file or die "can"t update $file: $!";
delete $lines[-1];

3 dla odpowiedzi № 2

Tylko ostatnia linia

Najbliższa składnia wydaje się być:

perl -ne "print unless eof()"

To zadziała jak sed, tzn .: bez wymogu odczytu całego pliku do pamięci i może z nim pracować FIFO lubić STDIN.

Widzieć:

perl -ne "print unless eof()" < <(seq 1 3)
1
2

albo może:

perl -pe "$_=undef if eof()" < <(seq 1 3)
1
2

Pierwsza i ostatnia linia

perl -pe "
BEGIN {
chomp(my $first= <>);
print "Something special with $firstn";
};
do {
chomp;
print "Other speciality with $_n";
undef $_;
} if eof();
" < <(seq 1 5)

wyrenderuje:

Something special with 1
2
3
4
Other speciality with 5

Najkrótsza: pierwsza i ostatnia linia:

perl -pe "s/^/Something... / if$.==1||eof" < <(seq 1 5)

wyrenderuje:

Something... 1
2
3
4
Something... 5

Spróbuj tego:

perl -pe "BEGIN{$s=join"|",qw|1 3 7 21|;};
if ($.=~/^($s)$/||eof){s/^/---/}else{s/$/.../}" < <(seq 1 22)

... coś jak sed dowództwo:

sed "1ba;3ba;7ba;21ba;$ba;s/$/.../;bb;:a;s/^/---/;:b" < <(seq 1 22)

W pliku skryptu:

#!/usr/bin/perl -w

use strict;

sub something {
chomp;
print "Something special with $_.n";
}

$_=<>;
something;

while (<>)  {
if (eof) { something; }
else { print; };
}

da:

/tmp/script.pl < <(seq 1 5)
Something special with 1.
2
3
4
Something special with 5.

-1 dla odpowiedzi nr 3

Mam nadzieję, że próbujesz wykonać polecenie "sed"od środka skryptu perla. Polecam nie używać tego podejścia, ponieważ będzie działać tylko w systemach bez systemu Windows. Poniżej znajduje się perl "metoda, w której można przetwarzać tylko pierwszą i ostatnią linię, a nie wysiłek, aby usunąć zawartość pliku.

Zakładając "myfile.txt" jako plik wejściowy:

open (FH, "<", "myfile.txt") or die "Unable to open "myfile.txt": $! n";

$i = 1;

while(<FH>){
next if ($i++ == 1 or eof);
# Process other lines
print "nProcessing Line: $_";
}

close (FH);

print "n";
1;

myfile.txt -

# First line
This is the beginning of comment free file.
Hope this is also the line to get processed!
# last line

Wynik -

Processing Line: This is the beginning of comment free file.

Processing Line: Hope this is also the line to get processed!