簡體   English   中英

模式刪除行導致文件的全部內容在Sed中被刪除

[英]Pattern to delete lines causes the whole contents of the file to be deleted in Sed

我在腳本中看到了這個奇怪的問題。 我有一個perl腳本,試圖刪除包含模式的行。

system ("sed '/_pattern_>/d' _path_to_file_ -i");

但這會刪除文件中的所有行。 我很困惑? 難道我做錯了什么?

在此處添加PERL代碼:

#!/bin/env iperl
my $size = shift @ARGV || 500; # sample size
my @sample;
my $ldc_pa_tlist = "_path_to_list1_";

system ("p4 revert $ldc_pa_tlist");
sysem ("p4 sync   $ldc_pa_tlist");
system ("p4 edit   $ldc_pa_tlist");

open FH1, "<", "_Master_List_" or die "Couldn't open file : $! \n";
open FH2, ">", $ldc_pa_tlist or die "Couldn't open file : $! \n";

my $taken = 0; # for making sure we get the first $size lines

while( my $line =  <FH1> ) {
   chomp $line;
  if ( rand(1) < ($size/$.) ){
    my $position;
    do{
    $position = int rand($size);
  }
  while( $taken < $size && $sample[$position] );
    $sample[$position] = $line;
    $taken++;
  }
}

system ("sed '/2frame/d' $ldc_pa_tlist -i");

while ( my $out_line = <FH2> )  {
  next unless ($out_line =~ m/_some_pattern_/);
  for( my $i = 0; $i < @sample; $i++ ){
    print FH2 "$sample[$i] add_opt=\"-2frame\" add_opt=\"-mr_freq_shift:0\"\n";
  }
  last; #exit while loop
}

close FH1;
close FH2;

謝謝

您在這里遇到一些問題:

  • 您正在截斷文件並期望它具有數據
  • 您試圖打開一個文件兩次(一次在Perl中,一次在其外部)
  • 您正在嘗試從已打開以供寫入的文件中讀取
  • 你有比賽條件

首先,請執行以下操作:

open FH2, ">", $ldc_pa_tlist or die "Couldn't open file : $! \n";

您正在打開一個文件進行輸出並將其截斷為空(這就是">"open函數的作用。

在Perl中打開文件后,然后在運行帶有-i標志的sed命令時再次將其打開: system ("sed '/2frame/d' $ldc_pa_tlist -i"); 您不想從兩個不同的程序中同時打開同一文件進行修改。

基本上,當您運行該sed命令時, sed sed只讀方式打開指定文件並以讀寫方式打開新的臨時文件。 它正在讀取原始文件,進行處理以刪除所有匹配的行,並將結果寫入新的臨時文件。 sed然后關閉兩個文件,並移動(重命名)新的臨時文件以替換原始文件名。 如果您已在其他位置打開了原始文件(就像您一樣),現在您將獲得一個已從文件系統刪除的文件,並且在關閉文件描述符時將不復存在。

當您已經在另一個程序中打開文件時,您正在處理的文件與sed輸出的文件不同。

最好的選擇是使用Perl替換sed功能。 根據文件的大小,最簡單的方法是將整個文件的內容讀入內存,刪除不需要的條目,然后再寫回。 如果文件太大而無法以這種方式處理,則可以像sed ,打開文件進行讀取和寫入,然后從輸入中讀取內容,過濾掉不需要的行並將其寫入輸出。

另外,如上文所述,您可能想要替換:

open FH2, ">", $ldc_pa_tlist or die "Couldn't open file : $! \n";

與:

open FH2, "+<", $ldc_pa_tlist or die "Couldn't open file : $! \n";

這將打開文件進行讀寫,但在打開文件時不會破壞文件(刪除內容)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM