2

使用此命令,我试图在 M502 的两个模式和 M502 之后的第二行之间插入 M09,看起来像 X41.5Y251.5T201。

具体来说,我试图在最后一行之前插入 M09。

sed -i "/M502/{:a;N;/\(.*\)T\([0-9]\+\)/!ba;N;s/\(.*\)\n\(.*\)T\([0-9]\+\)/\1\nM09\n\2T\3/}" *.nc

结果:

M502
M09
X1287.2Y353.28T324
..........
G27X-310.27
X41.5Y251.5T201

应该:

M502
X1287.2Y353.28T324
..........
G27X-310.27
M09
X41.5Y251.5T201

我正在尝试将最后一行与 匹配\(.*\)T\([0-9]\+\),但这会选择第二行。如何让 sed 忽略此表达式的第一个匹配项?

我强调我可能有数量不足的此类文本块,我需要为每个文本块插入 M09。

4

2 回答 2

1

使用您显示的示例,请尝试以下awk代码。

awk '
/.*T[0-9][0-9]*/{ found=1       }
FNR==1          { prev=$0; next }
                {
                  print prev
                  prev=$0
                }
END{
  if(found)     { print "M09"   }
  print prev
}
' Input_file

上面的代码只会在终端上打印值,以防您想将输出保存到 Input_file 本身,然后附加 > temp && mv temp Input_file到上面的代码中。

于 2021-10-26T12:18:58.220 回答
1

我如何匹配的第二个实例\(.*\)T\([0-9]\+\)?它必须是一个表达式。谢谢您的帮助。

假设您想第二次在与上述正则表达式匹配的行之前插入一些文本,那么您应该考虑使用 awk,因为您可以执行以下操作:

$ awk '/.*T[0-9][0-9]*/ { n++ } !p && n == 2 { print "M09"; p = 1 } 1' input.txt
M502
X1287.2Y353.28T324
..........
G27X-310.27
M09
X41.5Y251.5T201

上述命令的分解是:

/.*T[0-9][0-9]*/ { n++ }            # Everytime the regex match add one to `n`
!p && n == 2 { print "M09"; p = 1 } # If n = 2 and we havn't printed a header yet,
                                    # then print "M09"
1                                   # Print every line
于 2021-10-26T12:20:50.890 回答