获取上一行

时间:2016-05-24 15:35:40

标签: regex sed

我正在使用sed脚本来运行文件并进行替换。现有文件将具有一系列浮点数,并且在找到字母时序列结束。大多数替换都很简单,看起来像这样:

s/(-?[0-9]*\.?[0-9]*) (-?[0-9]*\.?[0-9]*) l/lineto(\1,\2);/g

只需用函数调用替换raw命令。

某些命令没有1:1等效于函数调用,因为它们依赖于上一行中找到的坐标。

所以我需要转变一下:

1.068 7.399 m
-11.794 13.153 -11.843 12.234 v

进入这个:

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

上一行的最后一组坐标需要用作此行的第一组坐标。上一行中的坐标并不总是以相同的标记结尾,因此:

-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);

这是我的尝试(没有工作,为了便于阅读而分为几行,这是一个单行):

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

这样做的正确方法是什么?

1 个答案:

答案 0 :(得分: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是每行的最后一个字段,用于选择要应用的转换。命令前面的两个字段分配给变量onetwo(x和y可能是更好的选择)。