【问题标题】:GNU sed 4.2.1 matching second occurenceGNU sed 4.2.1 匹配第二次出现
【发布时间】:2021-12-11 19:36:16
【问题描述】:

通过这个命令,我试图在 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。

【问题讨论】:

    标签: windows command-line gnu-sed


    【解决方案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附加到上面的代码中。

    【讨论】:

      【解决方案2】:

      如何匹配 \(.*\)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
      

      【讨论】:

      • 据我了解,这将在 .*T[0-9][0-9]* 的第二个“全局”实例之前添加一次 M09。我可以在需要添加 M09 的文本块数量不足。因此,对于我的 sed 示例,我只需要忽略每个 M502 之后的第一个 (.*)T([0-9]\+) 匹配项。
      • @VardenisPavardenis 您需要编辑您的问题,或者发布另一个完全针对您的特定问题的问题。从您的问题不清楚的不同答案的数量中可以明显看出。
      • 这都是我的具体问题。对其进行了编辑以尝试更清楚地表达。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-27
      • 2016-10-20
      • 1970-01-01
      • 1970-01-01
      • 2014-10-28
      • 2019-07-19
      相关资源
      最近更新 更多