2012-02-22 8 views
1

と複数行印刷:パターンは/*で始まり、*/\n(override\s+)publicで終わる、このような何かやってみました を:私はどのようにあなたを求めていますマッチと私は次のように一致するようにしようとしているSED

sed -n '/\/\*/,/\*\/\n(override\s+)public/p' file 

そして、ここをそれを正しく書くには

grepやawkでできることなら、それはオプションです。perlで1つのライナーであれば、それでも問題ありません。

PS。私はsed正規表現の構文がわからないが、\sは空白であることを理想的には[\ \t\r\n]とする。

EDIT:

はあなたが持っていると仮定します。

/** 
* Some comment goes here 
*/ 
override public function ... 

/** 
* A comment for another function 
*/ 
public function ... 
発現は、これらの二つの結果あなたを与えるだろう

/** 
* Some comment goes here 
*/ 
override public 

/** 
* A comment for another function 
*/ 
public 

EDIT: 誰かが下の正規表現をsedに変換することができれば、それは仕事をするでしょう。

/\/\*(!?\*\/)*\*\/\s*(overrides\s+)?public/gm 

mフラグは、正規表現が複数行であることを意味します。つまり、ネガティブ先読みグループも行末に一致します。しかし、それは可能ではないですが、一致する行が終了した場合は、その後、式は次のようになり、まだ可能です:

/\/\*((!?\*\/)*$)*\*\/[\r\n\t\ ]*(overrides[\r\n\t\ ]+)?public/g 
+0

行100と500が "/ *"で始まり、行200と600が "public override"で始まる場合(これら2つの単語の間に空白がある場合) 600、 "public"で終わる? – Beta

+0

'sed'は一度に1行しか処理できません。複数の行にまたがるパターンが必要な場合は、以前のllnesがパターンの開始と一致するかどうかを追跡するスクリプトを作成する必要があります。 – tripleee

答えて

2

私は、これはあなたがやりたいだろうと思う:

perl -0777 -n -e ' 
    for (m/(\/\*.*?\*\/\s+(override\s+)?public)/s) { 
     print "$1\n"; 
    } 
' file 

-0777はperlのです"行全体のデフォルトではなく、fileのすべてを一度に読む"のための規約です。

-nないプリント(それを印刷しない-pとは対照的に)入力ファイルにPerlを伝えます。

-eは、コマンドラインからプログラムを読み取るようにperlに指示します。

正規表現はあなたが書いたとおりですが、あなたがしようとしていることが明確ではないため、コンマビットを削除しました。私は、ファイル全体を '単一の行'として扱うsフラグと一緒にできる限り最短の一致にマッチするために、控えめな*?の量指定子を使用しました。それ以外の場合は.*?が行境界に一致します。

ifm句は、正規表現が一致すると、式が真と評価されます。式の末尾にあるsは、入力を1行として扱います。 if句の中には、$1という最初のグループが正規表現にマッチしています。 2番目のグループを印刷する場合は、$2を使用します。

更新日:はそれがoverridepublicプリントアウトされますので、グループを変更し、あなたの編集あたりoverrideはオプションになり、それがパターンの複数のインスタンスと一致するforifを変更しました。

関連する問題