私が持っている:内部パターンと一致します。複数行
%{ lorem ipsum dolor
sit %{hello
world}%
amet}%
は私がしたい:
あるhello
world
が、私は、複数行にまたがるない場合があり、ネスト%{...}%
の任意の数の内部%{...}%
を維持したいです。
sedまたはawkの方法はありますか?
私が持っている:内部パターンと一致します。複数行
%{ lorem ipsum dolor
sit %{hello
world}%
amet}%
は私がしたい:
あるhello
world
が、私は、複数行にまたがるない場合があり、ネスト%{...}%
の任意の数の内部%{...}%
を維持したいです。
sedまたはawkの方法はありますか?
この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}'
それが唯一の開始の時に...%{
を削除することを除いてそれは、以前と本質的に同じアプローチを使用しています入力の最後に}%...
と入力し、完了後に%{...}%
が含まれていない}%...%{
のインスタンスをすべて削除して、改行で置き換えます。
ありがとう、私はこれを最初に使うことができます。一般的には、 '%{...}%%'を任意にネストすることができる他の '%{...}%'ブロックを含まないすべての '%{...}%'ブロックフォーマットされています。 – Eelvex
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を使用してください。
一つの可能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スペース上であることを知る必要があります。
キャプチャする必要のある複数の '%{...}%%ブロックが存在する可能性はありますか?それとも、ただ一つだけあることは確かですか? – ruakh
複数のブロックが可能ですが、「ちょうど1」の場合でも役立ちます。 – Eelvex
あなたの接頭辞 'sit'を数えることができますか?がんばろう。 – shellter