2012-03-25 5 views
1

私が持っている:内部パターンと一致します。複数行

%{ lorem ipsum dolor 
    sit %{hello 
      world}% 
    amet}% 

は私がしたい:

ある
hello 
    world 

が、私は、複数行にまたがるない場合があり、ネスト%{...}%の任意の数の内部%{...}%を維持したいです。

sedまたはawkの方法はありますか?

+0

キャプチャする必要のある複数の '%{...}%%ブロックが存在する可能性はありますか?それとも、ただ一つだけあることは確かですか? – ruakh

+0

複数のブロックが可能ですが、「ちょうど1」の場合でも役立ちます。 – Eelvex

+0

あなたの接頭辞 'sit'を数えることができますか?がんばろう。 – shellter

答えて

2

このsedコマンド:

sed -n -r 'H; ${g; s/([^}]|\}[^%])*%\{//; s/\}%([^%]|%[^{])*//; p}' 

が、その後、パターンスペースに入力の全体を収集し、}%...(に世話をして(...}%が含まれていないことを確認するために世話をして)...%{削除されます...%{が含まれていないことを確認してください)、結果を印刷してください。したがって、1つのブロックだけが必要な場合に適しています。複数のブロックがある場合は扱いにくいですが、それについてさらに検討し、うまくいけばこの回答を更新します。あなたがそれをサポートしていない非GNU sedを使用しているので、もし

-rが(代わりに基本的なものの、拡張正規表現をサポートする)ことを注意は、sedにGNUの拡張である、私に知らせてください。


編集を追加する: OK、ここでは複数のブロックをサポートするバージョンがあります:

sed -n -r 'H; ${g; s/^([^}]|\}[^%])*%\{//; s/\}%([^%]|%[^{])*$//; s/\}%([^%]|%[^{])*([^}]|\}[^%])*%\{/\n/g; p}' 

それが唯一の開始の時に...%{を削除することを除いてそれは、以前と本質的に同じアプローチを使用しています入力の最後に}%...と入力し、完了後に%{...}%が含まれていない}%...%{のインスタンスをすべて削除して、改行で置き換えます。

+0

ありがとう、私はこれを最初に使うことができます。一般的には、 '%{...}%%'を任意にネストすることができる他の '%{...}%'ブロックを含まないすべての '%{...}%'ブロックフォーマットされています。 – Eelvex

1

AWK方法:

gawk ' 
/%{/ { 
    match($0,/%{.*/) 
    text=substr($0,RSTART+2,RLENGTH-2) 
} 
!/% {/ && !/}%/ { 
    text=text "\n" $0 
} 
/}%/ { 
    match($0,/}%/) 
    text=text "\n" substr($0,1,RSTART-1) 
    print text 
    exit 
}' 

複数{%または%}が同じ行にあるかどうこれは動作しません。この場合、matchコマンドでarrayを使用してください。

1

一つの可能​​TXR方法:

単に暗黙的にwantedと呼ばれるリストに集めます変数wantedに正規表現の一致を集める(一つの大きなラインなど)の入力、フリーフォームをスキャンします。

そして、それぞれの頭と尾から2文字を切り刻むように叩き出します。

$ txr -c '@(freeform) 
@(coll)@{wanted /\%{(~(.*(\%{|}\%).*))}\%/}@(end) 
@(output) 
@(rep)@{wanted [2..-2]}@(end) 
@(end)' - 
asdf asdf %{ 
    %{ asdf 
asdf    
}% %{boo}% }% 
[Ctrl-D][Enter] 
asdf 
asdf 
boo 

正規表現は、補数を意味します。変数wantedは、%{とそれに続くではないの部分一致文字列として%{または}%を含むテキストをキャプチャし、その後には%}が続きます。 TXR正規表現は、補数、交差、差をサポートします。%は貪欲でないゼロ以上の演算子なので、\%という文字を書く必要があります。

質問に与え例えば出力は次のようになります。それが本当に必要とされている場合

hello 
      world 

ではなく

hello 
    world 

著者は明らかにしませんでした。これは、%{helloが行の途中で発生するため、hの列の位置がであることを知っていなければならないので、のwが2スペース上であることを知る必要があります。

関連する問題