2017-08-15 11 views
2

を使用して、開始と終了の間のブロックに一致するようにsedの私は、次の情報を持つファイルがあります:のgrepまたは同じパターン

start pattern1 
line1 
line2 
... 
end pattern1 
line3 
line4 
start pattern2 
... 

を私の出力は次のようになります。
start pattern1 line1 line2 end pattern1

私が何を知っていればpattern1 、私は

sed '/start pattern1/,/end pattern1/p' <file> 

を行うことができますが、ここで、私はpattern1(のような\S+を合わせたいれますperl正規表現で)、末尾に同じもの($1のようなもの)を使用してください。どうやってやるの? pattern1 S(両端を含む)の間で印刷するAWKを使用

+1

予想される出力は何ですか、あなたはあなたの記事でも、それを言及してください可能性があります。 – RavinderSingh13

+2

依頼にはまだ 'sed -n '/ pattern1 /、/ pattern1/p' input'を使用することができます – CWLiu

+0

実際の例を教えてください。 'start'と' end'という単語が存在しますか?または 'patern'だけ? – Toto

答えて

4

、パターンがコメントで指定された、実際のパターンにアップデート同時に

perl -wnE'print if /start ([A-Za-z0-9_:]+)/ ... /end $1/' intput.txt 

で試験されていません。

私はキャプチャを使って(doの代わりにprintブロック)テストしましたが、他のキャプチャがあると問題が発生する可能性があります。 他の正規表現で何かを何もキャプチャしない場合、これは動作します。

..の代わりに...を使用し、を使用しないでください。次の評価まで右オペランドをテストしてください。

+0

これを書いたように(やりなく)書いてみましたが、うまくいきません。ファイル全体を印刷します。 – user2623661

+0

@ user2623661もう一度試してみました(私が投稿したときにテストされました)、ワンライナーをコピーして貼り付け、その前と後に行を追加してあなたの例のようなファイルで実行しました。できます。あなたの本当の入力はどうですか? – zdim

+0

@ user2623661あなたのコメントに気づきました。「パターン1」は「_unknown_」です。それはどういう意味ですか?どのようなものですか? 「開始」(または実際の「_prefixキーワード_」)に続くものか、それとも何かできるルールがありますか? – zdim

1

$ awk '/pattern1/{p=!p;print;next} p' file 
pattern1 
line1 
line2 
... 
pattern1 

正規表現が/^pattern1$/又は$0=="pattern1"と同様、良好に定義することができます。 Perlでrange operator

0

解決策をawkで試してみてください。これがあなたに役立つかどうか教えてください。

awk -v RS="" '{match($0,/start pattern1.*start pattern1/);print substr($0,RSTART,RLENGTH)}' Input_file 

EDIT: OPはCWLiuあたりとして、私はあまりにも任意の空行の場合に動作する提案を追加してい、あまりにも空行を持つことができINPUT_FILEのように示していません。だから、

awk '/start pattern1/{print;getline;while($0 !~ /start pattern1/){print;getline};print}' Input_file 
+0

pattern1の間に空白行が含まれていると、これは機能しません。 – CWLiu

+1

@CWLiu:OPはそれを言及しておらず、問題ではありません。私は空の行を扱うもう一つの解決法も追加しました。 – RavinderSingh13

0

(それはかなりはっきりしていないので)、ここでawk実装は、あなたの質問の代わりの解釈に基づいています。

あなたはstartで始まる最初の行からpattern1を検出し、その後、end pattern1まですべての行を印刷したい場合、あなたはこのようにそれを行うことができます。

$ awk '/^start/{pat=$2; next} /^end/&& $2~pat {exit} {print}' file 
line1 
line2 
... 
1

これはあなたのために働くかもしれない(GNU SED):

sed -n '/pattern/,//p' file 

これは、フリップフロップ一致する範囲を呼び出し、空//は、最後の正規表現と一致します。 pは、レンジスイッチが真である間はすべてを表示します。

N.B.-nはseds grepのような性質を呼び出し、自動印刷をオフにします。

代替:

sed '/pattern/!d;:a;n;//!ba' file 
+0

+1。 '//'はここでsedの魔法です。つまり、範囲内での置換やマッチングで破損することになります。あなたが望むなら、sedをsedにパイプしなければならないでしょう。 – stevesliva

+0

私は '開始'と '終了'の接頭辞が 'パターン'にあるので、私はこの事は私のケースではうまくいかないと推測しています。 – user2623661

関連する問題