使用这个命令,我试图在M502的两个模式和M502之后的第二行之间插入M09,看起来像X41.5Y251.5T201。
特别是我试图在最后一行之前插入M09。
sed -i "/M502/{:a;N;/(.*)T([0-9]+)/!ba;N;s/(.*)n(.*)T([0-9]+)/1nM09n2T3/}" *.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。
对于您所展示的示例,请尝试以下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
附加到上面的代码中。
我如何匹配
(.*)T([0-9]+)
的第二个实例?它必须是一个表达式。谢谢你的帮助。
假设您想在第2次匹配上述正则表达式的行之前插入一些文本,那么您应该考虑使用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