2013-09-05 99 views
-2

我有以下提到的格式數據的文本文件多行..的Perl:刪除文本文件具有特定字符串

@rectype='ABC' @recname='123' @rec_id='1K2j' etc... 
@rectype='DEF' @recname='matin' @rec_id='458i' etc... 
@rectype='ABC' @recname='John' @rec_id='lom0' etc... 
@rectype='GHI' @recname='Kalme, @rec_id='pl90' etc... 
@rectype='KLM' @recname='Kitty' @rec_id='987k' etc... 
@rectype='ABC' @recname='OMR' @rec_id='lo09' etc... 

現在,我必須刪除所有的線有@ rectype ='ABC '..在輸入文件中有這種類型的多行。這是一種迫切的,因爲我不是perl編碼器,我發現很難找出方式。

請推薦!!!

注:我只需要對輸入文件進行更改。我不需要創建一個單獨的輸出文件。

+5

'grep -v「@ rectype ='ABC'」'? – TLP

+0

我不明白爲什麼這個答案是downvoted。這是一個非常簡單和優雅的解決方案。 – Keve

回答

1
#!/usr/bin/perl 
use warnings; 
use strict; 
use File::Slurp; 

my $output = 'output.txt'; 
open my $outfile, '>', $output or die "Can't write to $output: $!"; 

my @array = read_file('input.txt'); 
for (@array){ 
     next if ($_ =~ /^\@rectype='ABC'/);  
     print $outfile $_ ; 
} 

輸出(保存到 'output.txt的'):

@rectype='DEF' @recname='matin' @rec_id='458i' etc... 
@rectype='GHI' @recname='Kalme, @rec_id='pl90' etc... 
@rectype='KLM' @recname='Kitty' @rec_id='987k' etc... 
+0

因爲我需要在進行更改後更新輸入文件,而不是創建新的輸出文件。所以,我應該使用print $ _而不是$ outfile $ _? – Praveenks

+1

打印$ _將打印到命令行。使用:'my $ output ='input.txt'; 打開我的$ outfile,'>>',$輸出或死「不能寫入$輸出:$!」;' – fugu

2
perl -i -ne 'print if !/\@rectype = \047ABC\047/x' text_file 
+0

由於單引號衝突,這不起作用。一種選擇是使用它的八進制值,如:'... \ 047ABC \ 047 /'' – Birei

+0

@Birei你是對的,tnx –

+0

或者你可以在Perl代碼周圍使用雙引號。 – TLP

5

你並不需要做的是在Perl。您可以使用grep工具。

grep -v "@rectype='ABC'" input_file > output_file 

grep -v手段「打印每行不這個表達式匹配。」

相關問題