使用sed合并两个模式之间的行

9

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

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:

我需要合并两个标题之间的所有内容,以便更新后的输出文件看起来像这样:
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:
标题名称始终不变。

我在Windows中使用UnxUtils,所以很遗憾我没有awk来进行操作。我该如何使用sed来完成操作呢?

2个回答

21

使用sed:

sed '/HEADER 1/{n;:l N;/HEADER 2/b; s/\n//; bl}' input
  • n 跳过/打印当前行 (HEADER 1),清除缓冲区
  • l 是循环标签 (跳转到标签)
  • N 添加(追加)行到缓冲区(保留换行符)
  • /HEADER 2/b,其中b是分支(不带标签时为break),当看到HEADER2时跳出
  • s/\n// 移除缓冲区中的换行符
  • bl 跳回标签l

1
能解释一下吗? - DanMan
1
@DanMan,添加了一些解释。 - perreal
1
当我尝试这个时,我得到了“意外的EOF(等待}的)” - slashdottir

5
这展示了如何使用 awk 完成此操作。
您可以在 Windows 上下载 Gawk
awk '/HEADER/ {printf "\n%s\n",$0;next} {printf "%s ",$0}' file

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:

1
I'm using UnxUtils in Windows, so unfortunately I don't have awk - Chris Seymour
这也完美地运行了,感谢您的帮助和关于在Windows上使用Gawk的提示。 - jplusc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接