awk / sed在两个模式之间插入行

时间:2014-07-16 17:41:15

标签: linux bash awk sed

我有一台用于CNC机床的G代码文件,需要在模式之间插入两条线。基本上我需要编写一个简单的后处理器。 以下是我的CAM程序中的一小段代码:

G00 X-1.663 Y-0.992 Z+0.
G01 X-1.072 Y-0.992
G01 X-1.072 Y-0.874
G01 X-1.663 Y-0.874
G01 X-1.663 Y-0.992
G00 X-3.021 Y-0.992
G01 X-3.021 Y-0.874
G01 X-2.43 Y-0.874
G01 X-2.43 Y-0.992
G01 X-3.021 Y-0.992

我需要按顺序在G00和G01之间插入两行。所以上面的例子现在变成了:

G00 X-1.663 Y-0.992 Z+0.
M51
M04 F.1
G01 X-1.072 Y-0.992
G01 X-1.072 Y-0.874
G01 X-1.663 Y-0.874
G01 X-1.663 Y-0.992
G00 X-3.021 Y-0.992
M51
M04 F.1
G01 X-3.021 Y-0.874
G01 X-2.43 Y-0.874
G01 X-2.43 Y-0.992
G01 X-3.021 Y-0.992

我需要的另一件事是换行必须是Windows / DOS样式,最后是\ r \ n。这与需要DOS文本文件的旧的,变幻无常的CNC控制器有关。我可以使用另一个awk或sed脚本,但首选一个衬垫。 我在努力:

awk '/G00/,/G01/{print $0 RS "M51" RS "M04 F.1";next}1' FILE

但是在任何G00或G01之后添加了这些行。我只需要在G00和G01之间。 还有一件事,我更喜欢单行命令。 谢谢!

2 个答案:

答案 0 :(得分:5)

使用awk你可以这样做:

awk '$1=="G00"{p=1} p && $1=="G01"{print "M51"; print "M04 F.1"; p=0} 1' file
G00 X-1.663 Y-0.992 Z+0.
M51
M04 F.1
G01 X-1.072 Y-0.992
G01 X-1.072 Y-0.874
G01 X-1.663 Y-0.874
G01 X-1.663 Y-0.992
G00 X-3.021 Y-0.992
M51
M04 F.1
G01 X-3.021 Y-0.874
G01 X-2.43 Y-0.874
G01 X-2.43 Y-0.992
G01 X-3.021 Y-0.992

答案 1 :(得分:4)

您可以使用以下内容:

awk 'last=="G00" && $1=="G01" {print "M51\nM04 F.1"} {last=$1} 1' file

如果前一行的第一个字段是“G00”并且当前行的第一个字段是“G01”,则打印两行。

输出:

G00 X-1.663 Y-0.992 Z+0.
M51
M04 F.1
G01 X-1.072 Y-0.992
G01 X-1.072 Y-0.874
G01 X-1.663 Y-0.874
G01 X-1.663 Y-0.992
G00 X-3.021 Y-0.992
M51
M04 F.1
G01 X-3.021 Y-0.874
G01 X-2.43 Y-0.874
G01 X-2.43 Y-0.992