GNU sed 4.2.1匹配第二次出现



使用这个命令,我试图在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

最新更新