2016-05-24 6 views
1

私はファイルを実行して置換を行うためにsedスクリプトに取り組んでいます。既存のファイルには浮動小数点数のシーケンスがあり、文字が見つかるとシーケンスが終了します。置換のほとんどは次のようになります。前の行と一致するグループを取得する

rawコマンドを関数呼び出しで置き換えるだけです。

一部のコマンドは、前の行にある座標に依存するため、関数呼び出しと同等の1:1はありません。

move(1.068,7.399); 
curveto(1.068,7.399,-11.794,13.153,-11.843,12.234); 

前の行からの座標の最後のセットは、この行の座標の最初のセットとして使用する必要があります。この中へ

1.068 7.399 m 
-11.794 13.153 -11.843 12.234 v 

は、だから私は、これをオンにする必要があります。

-7.451 17.792 -10.366 16.42 -11.198 14.444 c 
-11.794 13.153 -11.843 12.234 v 

ニーズがこれになるために:

curveto(-7.451,17.792,-10.366,16.42,-11.198,14.444); 
curveto(-11.198,14.444,-11.794,13.153,-11.843,12.234); 

がここに分かれて作業していない私の試み(、だ。このように、前の行の座標は常に、同じトークンでは終わりませんこれは1ライナーです):

s/ 
.*(-?[0-9]*\.?[0-9]*) (-?[0-9]*\.?[0-9]*) [a-zA-Z]$^(-?[0-9]*\.?[0-9]*) (-?[0-9]*\.?[0-9]*) (-?[0-9]*\.?[0-9]*) (-?[0-9]*\.?[0-9]*) y/ 
curveto(\1,\2,\3,\4,\5,\6);/ 
g 

これは正しい方法はありますか?あなたの問題のために

+0

「sed」する必要がありますか? –

+0

私はすでに 'sed'にコードを書いていますが、他のすべての置換えのためです。最終的にこれはbashスクリプトになるでしょう。ストリーム操作を行う必要があるので、Linux/Unixユーティリティはすべて公正なゲームです。何を思っていたんだ? – charmeleon

+0

私は 'awk'を考えていました。私の考えでは、' sed'よりも複数行の要求をよりエレガントに扱います。 –

答えて

1

、あなたはこれらの線に沿って何かを試みることができる:

$NF == "m" { print "move(" $1 "," $2 ");" } 
$NF == "v" { print "curveto(" one "," two "," $1 "," $2 "," $3 "," $4 ");" } 
$NF == "c" { print "curveto(" $1 "," $2 "," $3 "," $4 ");" } 
{ one = $(NF-2); two = $(NF - 1) } 

$NFは、各行の最後のフィールドで、適用するためにどの変換を選択するために使用されます。コマンドの前の2つのフィールドは、変数onetwoに割り当てられます(xとyはより良い選択かもしれません)。

+0

ありがとう、これは私に行く。必ずしも行を終了するわけではないパターンがいくつかありますが、それらを調整します。 – charmeleon

+0

最後の2つの座標を保存する必要がないルールに 'next'を追加することでこれを少し速くすることができます。 –

関連する問題