2011-01-05 1 views
0
$ cat somefile.txt 
afsdfv 
asdf[ABC]dafga 
asdfasf 
yxcvyxv[/ABC] 
asdadf 
yv[ABC]sdfb 
sdfgadfg 
[/ABC]adf 
asdf 
$ cat somefile.txt | NEEDEDONELINER > output.txt 
dafga 
asdfasf 
yxcvyxv 
sdfb 
sdfgadfg 
$ 

だから、 "NEEDEDONELINERは" だけ[ABC][/ABC]間の文字を出力します。出力は

[ABC]は複数回発生する可能性があり、周囲にランダムな文字が存在する可能性があります。

[ABC][/ABC]の間にランダムな文字が必要です。

がanticipiationにありがとう:\

私はPerlを学ぶ時間がありません!

答えて

0

はいあなたが。 perlretut、次にperlre

m!\Q[ABC]\E\K(.*?)(?=\Q[/ABC]\E)!g; 

しかし、それはアカウントの複数行の文字列に入れていない - あなたの明確化を有しています。

use strict; 
use warnings; 
use 5.010; 

open my $fh, '<', $ARGV[0]; 
my $full_file = do { local $/; <$fh> }; 

say join "\n", $full_file =~ m! 
           \Q[ABC]\E \K 
           (.*?) 
          (?=\Q[/ABC]\E) 
          !gxs; 

またはワンライナーとして:

perl -E 'say join qq!\n!, do { local $/; <> } =~ m!\Q[ABC]\E\K(.*?)(?=\Q[/ABC]\E)!gs' somefile.txt > output.txt 

しかし、どのようなファイルが巨大である場合には?それらをメモリに読み込むだけでは動作しません。あなたは自分でそれを理解しなければならないでしょう。

+0

ああ、神様。それは実際に動作します。私は驚いています。 – LanceBaynes

1

私は猫の全く役に立たない使用を参照してください。

perl -le '$/="";$_=<>;print$2while/\[(ABC\])(.*?)\[\/\1/gs' <file.txt 

(ああ、このいくつかの素晴らしいゴルフ;-)

+0

あなたのコードのスペースは素晴らしくないでしょうか? –

+0

スペースがあれば、「ワンライナー」の目標に達するのが難しくなります。コマンドも60文字であれば、PS1のプロンプトとファイル名は多くの場合、80のターミナルウィンドウで1行を超えています。 – user562374

0

2,3日前にFedoraのメーリングリストで非常によく似た質問がありました。ここに私がそこに与えた答え(かなり明白な編集が必要です):

#!/usr/bin/perl 

use strict; 
use warnings; 

while (<>) { 
    if (m|\[XYZ]| .. m|\[/XYZ]|) { 
    next if m|\[/?XYZ]|; 
    print; 
    } 
}