2011-02-10 12 views
2

正規表現パターンのテキスト入力を確認するためにperlを使用しますが、1つのパターンはperl -peで動作しません。perl -pe regexの問題

次のパターンは、コマンド呼び出しでは動作しません:

s![a-zA-Z]+ +(?:.*?)/(?:.*)Comp-(.*)/.*!$1! 

は、私はLinuxのシェルを使用しています。続いて、私は私の正規表現をテストするために使用するコール:

cat test | perl -pe 's![a-zA-Z]+ +(?:.*?)/(?:.*)Comp-(.*)/.*!$1!' 

ファイルテスト:

A MaintanceGie?\195?\159mannFlock/System/Comp-Database.cpp 
A MaintanceGie?\195?\159mannFlock/System/Comp-Cache/abc.h

結果:

A MaintanceGie?\195?\159mannFlock/System/Comp-Database.cpp 
Cache

どのように私は、最初の結果を削除することができますか?

ありがとうございました。

+0

あなたはどのようなシェルを使用していますか?あなたの入力は何ですか?期待される成果は? –

+0

情報が追加されました。 – CSchulz

+0

あの地味なバックスラッシュは8進数です - 私は**非8進数を意味します** - そこにゴークはありますか?確かに私にエンコードの問題のように見えます! – tchrist

答えて

2
$ cat input 
A MaintanceGie?\195?\159mannFlock/System/Comp-Database.cpp 
A MaintanceGie?\195?\159mannFlock/System/Comp-Cache/abc.h 

$ perl -ne 'print if s![a-zA-Z]+ +(?:.*?)/(?:.*)Comp-(.*)/.*!$1!' input 
Cache
3

"Comp - (。*)"の後の最後のスラッシュは、それを実行している可能性があります。 「データベース」のファイル内容にスラッシュはありません。 Comp-(.*)/.*Comp-(.*)[/.].*に置き換えて、サブディレクトリまたはファイル拡張子と一致するようにしてください。

+0

私のデータに間違いがありました。しかし、私はマッチングしていないとき、なぜ私は全体のラインを取得する? – CSchulz

+0

@ H3llGhost:代替が行われていないため。 – Toto

1

問題は、正規表現の最後のスラッシュ文字です。ドットをエスケープするのではなく、入力文字列にはないスラッシュ文字だけです。

s![a-zA-Z]+ +(?:.*?)/(?:.*)Comp-(.*)[./].*!$1! 

編集:は、新たな入力データと一致するように更新し、別のオプションを追加しました:このお試しください

perl -ne 'print "$1\n" if /Comp-(.*?)[.\/]/' 
:一方

を、交換用の正規表現は次のように置き換えられるかもしれません

それから、それが含んでいるものと完全な行を解析する必要はありません。

+0

'+'の代わりに '\ s +'を使用することも害ではないかもしれません。 –

+0

私のデータに間違いがありました。しかし、私はマッチングしていないとき、なぜ私は全体のラインを取得する? ** \ s + **は何ですか?私はそれを聞いたことがない。 – CSchulz

+0

s ///演算子を使用してregex-replaceを実行しているためです。正規表現が一致しない場合、置換は行われません。 – bvr

1

\ sは空白(空白、タブ、改行)と一致し、「+」は1つ以上の文字を意味します。この場合、 '\ s +'は1つ以上の空白を検索することを意味します。

cat test 
A MaintanceGie?\195?\159mannFlock/System/Comp-Database.cpp 
A MaintanceGie?\195?\159mannFlock/System/Comp-Cache/abc.h 

perl -ne 'print "$1\n" if /\w+?\d+?\d+\w+\/\w+\/Comp-(\w+)[\/]/' test