2

ファイルでいっぱいのディレクトリがあり、ヘッダーとフッターを削除する必要があります。それらはすべて可変長であるため、head または tail を使用しても機能しません。各ファイルには検索できる行がありますが、その行を結果に含めたくありません。

それは通常です

*** Start (more text here)

そして、で終わります

*** Finish (more text here)

ファイル名を同じままにしたいので、オリジナルを上書きするか、別のディレクトリに書き込み、自分で上書きする必要があります。

もちろんLinuxサーバー上にあるので、Perl、sed、awk、grepなどがあります.

4

7 に答える 7

3

フリップフロップを試してみてください!「..」演算子。

# 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スイッチを使用して、ファイルを次のように更新できます。

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

...これはdata.txtを変更しますが、事前に「copy_data.txt」としてコピーを作成します。

于 2008-11-17T19:54:14.060 に答える
2

GNUcoreutilsはあなたの友達です...

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

これにより、目的のファイルがとして生成されますxx00。この動作は、オプション、、、およびを使用して変更できますが--prefix--suffix自分でマニュアル--digitsを参照してください。は多数のファイルを生成するように設計されているため、接尾辞のないファイルを生成することはできません。そのため、手動またはスクリプトを使用して上書きを行う必要があります。csplit

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

必要に応じてループを追加します。

于 2008-11-17T23:26:50.950 に答える
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 コマンドを使用して、次のような方法を試す必要があるもう 1 つの方法があります。

csplit yourFileHere /Start/ /Finish/

また、NN が実行番号である「xxNN」という名前のファイルを調べます。 csplit のマンページも参照してください。

于 2008-11-17T18:23:54.477 に答える
0

perlfaq5の例のいくつか: ファイル内の行を変更、削除、または挿入するには、またはファイルの先頭に追加するにはどうすればよいですか? 役立つかもしれません。それらを状況に合わせて調整する必要があります。また、Leon のフリップフロップ演算子の回答は、Perl でこれを行う慣用的な方法ですが、使用するためにファイルを変更する必要はありません。

于 2008-11-17T22:52:31.690 に答える
0

元のファイルを上書きする Perl ソリューション。

#!/usr/bin/perl -ni
if(my $num = /^\*\*\* Start/ .. /^\*\*\* Finish/) {
    print if $num != 1 and $num + 0 eq $num;
}
于 2008-11-17T19:37:24.297 に答える
0

多分?削除しないで開始して終了します。

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

または...確信が持てません...しかし、うまくいく場合は、開始行と終了行も削除する必要があります。

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

d!あなたが持っているビルドに依存するかもしれsedません-確かではありません。
そして、私はそれを完全に(おそらく貧弱な)記憶で書きました。

于 2008-11-17T18:17:15.177 に答える
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;  
于 2008-11-17T18:34:51.333 に答える