我想在Perl
中只使用Sed
來捕獲給定文件中1000行和2000行之間的文件內容。 我嘗試了下面,但它沒有工作,請有人可以幫助我。使用perl提取給定行之間的文件內容
$firstLIne="1000";
$lastline="2000";
$output=`sed -n '$firstLIne,$lastline'p sample.txt`;
我想在Perl
中只使用Sed
來捕獲給定文件中1000行和2000行之間的文件內容。 我嘗試了下面,但它沒有工作,請有人可以幫助我。使用perl提取給定行之間的文件內容
$firstLIne="1000";
$lastline="2000";
$output=`sed -n '$firstLIne,$lastline'p sample.txt`;
這裏是另一個純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]
爲了比較,要做到這一點只在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行..
如果你只是想打印出來的線條則:
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_2k
僅if
他們在範圍1000 .. 2000
很高興瞭解Perl範圍運算符.. – 2014-12-06 10:28:56
@Hâkon:我提供的鏈接是(幾乎所有)運算符的perldoc頁面。 '〜'二進制反轉僅在優先表中提及。 ideom'=()=',雖然不是嚴格意義上的運算符,但有時候並沒有被提及(如果你希望在列表上下文中有一些表達式求值,但只對結果的大小感興趣,這很有用)。 – 2014-12-06 10:35:56
感謝您的解決方案..我可以將打印命令的結果寫入perl變量。 – Reddy 2014-12-06 10:39:01