2014-12-06 78 views
1

我想在Perl中只使用Sed來捕獲給定文件中1000行和2000行之間的文件內容。 我嘗試了下面,但它沒有工作,請有人可以幫助我。使用perl提取給定行之間的文件內容

$firstLIne="1000"; 
$lastline="2000"; 

$output=`sed -n '$firstLIne,$lastline'p sample.txt`; 

回答

4

這裏是另一個純perl的溶液:

my ($firstline, $lastline) = (1000,2000); 
open my $fh, '<', 'sample.txt' or die "$!"; 
while(<$fh>){ 
    print if $. == $firstline .. $. == $lastline; 
} 

如果不使用變量其他地方,你可以使用special use case of ..與常數(4 款,如果你使用常量表達式,他們自動獲得比$.):

while(<$fh>){ 
    print if 1000 .. 2000; 
} 

這裏是重要的來自perldoc的部分爲..運算符:

在標量上下文中,「..」返回一個布爾值。運算符像雙穩態觸發器一樣是雙穩態的,並模擬sed,awk和各種編輯器的行範圍(逗號)運算符。

編輯根據請求,將中間行存儲在變量中。

my ($firstline, $lastline) = (1000,2000); 
my $output = ''; 
open my $fh, '<', 'sample.txt' or die $!; 
while(<$fh>){ 
    $output .= $_ if $. == $firstline .. $. == $lastline; 
} 

print $ouput; 

另外,如果你的文件不是太大(它完全適合到內存),你也可以閱讀到一個列表,然後選擇行你感興趣:

my $output = join '', (<$fh>)[$firstline+1..$lastline] 
+1

很高興瞭解Perl範圍運算符.. – 2014-12-06 10:28:56

+0

@Hâkon:我提供的鏈接是(幾乎所有)運算符的perldoc頁面。 '〜'二進制反轉僅在優先表中提及。 ideom'=()=',雖然不是嚴格意義上的運算符,但有時候並沒有被提及(如果你希望在列表上下文中有一些表達式求值,但只對結果的大小感興趣,這很有用)。 – 2014-12-06 10:35:56

+0

感謝您的解決方案..我可以將打印命令的結果寫入perl變量。 – Reddy 2014-12-06 10:39:01

3

爲了比較,要做到這一點只在Perl中,一個可以寫:

my $firstLine=1000; 
my $lastLine=2000; 
my $fn="sample.txt"; 
my $output; 

open (my $fh, "<", $fn) or die "Could not open file '$fn': $!\n"; 
while (<$fh>) { 
    last if $. > $lastLine; 
    $output .= $_ if $. >= $firstLine; 
} 
close($fh); 

注意,這將停止線$lastLine之後,從文件中讀取..因此,如果該文件包含100,000行它會只讀第一2000行..

1

如果你只是想打印出來的線條則:

perl -ne 'print if 1000 .. 2000' example_data.txt

應該工作。

如果你想爲併入到一個腳本,在某種程度上,你可以在「半啜食」的文件句柄:

use strict; 
use warnings; 

open my $filehandle, 'example_data.txt' or die $!; 
my $lines_1k_to_2k ; 

while (<$filehandle>) { 
    $lines_1k_to_2k .= $_ if 1000 .. 2000 ; 
} 

print $lines_1k_to_2k ; 

.=運營商將線路添加到字符串變量$lines_1k_to_2kif他們在範圍1000 .. 2000