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

时间:2013-11-20 11:43:08

标签: sed grep

我有一个如下所示的输出文件:

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 个答案:

答案 0 :(得分:14)

使用sed:

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

答案 1 :(得分:3)

这显示了如何使用awk来完成 您可以下载Gawk for Windows

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: