2008-11-17 67 views
2

我有一個充滿文件的目錄,我需要將頁眉和頁腳從它們中拉出來。它們都是可變長度的,所以使用頭部或尾部不起作用。每個文件都有我可以搜索的行,但我不想將結果包含在結果中。如何從文件中提取文本行?

它通常

*** Start (more text here) 

而且隨着

*** Finish (more text here) 

我想要的文件名保持不變結束,所以我需要覆蓋源文件,或寫入到不同的目錄和我我會自己覆蓋他們。

噢,這是當然的Linux服務器上,所以我有Perl,sed的時,awk,grep的,等

回答

3

嘗試使用flip flop!「..」運算符。

# flip-flop.pl 
use strict; 
use warnings; 

my $start = qr/^\*\*\* Start/; 
my $finish = qr/^\*\*\* Finish/; 

while (<>) { 
    if (/$start/ .. /$finish/) { 
     next if /$start/ or /$finish/; 
     print $_; 
    } 
} 

U可以再使用-i perl的切換,以更新您的文件(S),像這樣.....

$ perl -i'copy_*' flip-flop.pl data.txt 

...這改變數據。txt,但事先作爲「copy_data.txt」進行復制。

+0

我怎麼會得到這個(觸發器/範圍運算符)工作與變量,而不是從文件讀取。說我有一個`$變量=「不想要這部分開始我想這部分,而不是完成」;`?因爲當它是一個變量而不是文件時,我無法獲得相同的效果,因此非常感謝您的幫助,謝謝 - – 2013-05-03 10:30:47

0

也許?從不刪除開始完成。

$ sed -i '/^\*\*\* Start/,/^\*\*\* Finish/d!' * 

或...那麼肯定...但,如果它的工作原理,應該刪除起點和終點線還有:

$ sed -i -e '/./,/^\*\*\* Start/d' -e '/^\*\*\* Finish/,/./d' * 

d!可能取決於sed構建你有 - 不確定。
而且,我完全寫了(可能很差)的內存。

1

爲了得到

cat yourFileHere | awk '{if (d > 0) print $0} /.*Start.*/ {d = 1}' 

爲了得到頁腳

cat yourFileHere | awk '/.*Finish.*/ {d = 1} {if (d < 1) print $0}' 

頭得到的文件到頁腳,只要你想:

cat yourFileHere | awk '/.*Start.*/ {d = 1; next} /.*Finish.*/ {d = 0; next} {if (d > 0) print $0}' 

還有一種方式,則csplit命令,你應該嘗試這樣的:

csplit yourFileHere /Start/ /Finish/ 

,並檢查名爲「xxNN」,其中NN運行數量的文件,也看看csplit manpage

+0

如果我沒有指出貓的不必要的用途,我將會失職。 awk'code'的文件名更容易輸入。 :) – converter42 2008-11-18 14:17:33

0

快速的Perl黑客入侵,未經過測試。在sed或awk中,我沒有足夠的流暢度來獲得這個效果,但是我會對如何完成這個任務感興趣。

#!/usr/bin/perl -w 
use strict; 
use Tie::File; 
my $Filename=shift; 
tie my @File, 'Tie::File', $Filename or die "could not access $Filename.\n"; 
while (shift @File !~ /^\*\*\* Start/) {}; 
while (pop @File !~ /^\*\*\* Finish/) {}; 
untie @File; 
0

覆蓋原始文件的Perl解決方案。

#!/usr/bin/perl -ni 
if(my $num = /^\*\*\* Start/ .. /^\*\*\* Finish/) { 
    print if $num != 1 and $num + 0 eq $num; 
} 
2

GNU的coreutils是你的朋友?

csplit inputfile %^\*\*\* Start%1 /^\*\*\* Finish/ %% {*} 

這將產生你想要的文件作爲xx00。您可以通過選項--prefix--suffix--digits更改此行爲,但請參閱manual。由於csplit設計產生的文件,它是不可能產生無後綴的文件,所以你將不得不做手工或通過腳本覆蓋:

csplit $1 %^\*\*\* Start%1 /^\*\*\* Finish/ %% {*} 
mv -f xx00 $1 

添加循環,你的願望。