本文介绍了使用sed合并两个模式之间的线的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个看起来像这样的输出文件:

I have an output file that looks like this:

HEADER 1:
server1 server2 server3
server4 server5 server6
server7 server8 server9
HEADER 2:

HEADER 1:
server10 server11 server12
server13 server14 server15
server16 server17 server18
HEADER 2:

我需要合并两个标题之间的所有内容,以便更新后的输出文件如下所示:

I need to merge everything between the two headers so the updated output file looks like this:

HEADER 1:
server1 server2 server3 server4 server5 server6 server7 server8 server9
HEADER 2:

HEADER 1:
server10 server11 server12 server13 server14 server15 server16 server17 server18
HEADER 2:

标题名称始终保持不变.

The header names always remain constant.

我在 Windows 中使用 UnxUtils,所以很遗憾我没有 awk 来进行操作.我如何使用 sed 来处理它?

I'm using UnxUtils in Windows, so unfortunately I don't have awk to do the manipulation. How do I go about it using sed?

推荐答案

使用 sed:

sed '/HEADER 1/{n;:l N;/HEADER 2/b; s/
//; bl}' input

  • n 跳过/打印当前行(HEADER 1),清除缓冲区
  • l 是循环标签(goto label)
  • N 向缓冲区添加(追加)行(保留换行符)
  • /HEADER 2/b,这里b是分支(没有标签,就是break),看到HEADER2就跳出来
  • s/// 删除缓冲区中的换行符
  • bl 跳回到标签 l
    • n skips/prints the current line (HEADER 1), clears buffer
    • l is a label for looping (goto label)
    • N adds (appends) lines to buffer (preserving newlines)
    • /HEADER 2/b, where b is branch (without the label, it is break), break out when HEADER2 is seen
    • s/// removes the newlines in the buffer
    • bl jumps back to label l
    • 这篇关于使用sed合并两个模式之间的线的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

07-24 18:41