我正在使用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
这样做的正确方法是什么?
答案 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
是每行的最后一个字段,用于选择要应用的转换。命令前面的两个字段分配给变量one
和two
(x和y可能是更好的选择)。