【问题标题】:awk/sed insert line between two patternsawk/sed 在两个模式之间插入行
【发布时间】:2014-09-07 08:46:47
【问题描述】:

我有一个用于 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

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

【问题讨论】:

  • 为什么要同时检查G00G01awk '/G00/{$0 = $0 RS "M51" RS "M04.F1"}1' file 还不够吗?
  • 因为可能有多个 G00 命令,在它们之间添加重复的命令会增加不必要的行并占用宝贵的文件空间。 CNC 控制器文件空间以千字节为单位,因为它是 1987 年制造的旧 Allen Bradley 8400。
  • +1 表示可以概括其答案的明确问题。 :)

标签: regex linux bash awk sed


【解决方案1】:

你可以使用这样的东西:

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

【讨论】:

  • 很抱歉,这很明显,但是1awk 程序末尾的目的是什么?
  • 它的计算结果为真,因此 awk 执行默认操作,即打印该行。速记是{print $0},或者只是{print}
【解决方案2】:

使用 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

【讨论】:

  • 哇!那很快。奇迹般有效。非常感谢。你的 awk fu 很强大。
  • @zx81 完成。谢谢你的提示。
  • 如果GOOG01 之间已经存在数据并且您是替换而不是添加,需要更改什么?
  • @5p0ng3b0b:G00G01 之间的数据将保持不变。新数据将在G01 行之前打印。
  • 感谢您的快速回复。我知道你在说什么。我在问需要对命令进行哪些更改才能替换“G00”和“G01”之间的所有数据而不是添加。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-08-15
  • 2012-07-11
  • 1970-01-01
  • 1970-01-01
  • 2013-03-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多