【问题标题】:Merge lines between two patterns using sed使用 sed 合并两个模式之间的线
【发布时间】:2013-11-20 11:43:08
【问题描述】:

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

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?

【问题讨论】:

    标签: sed grep


    【解决方案1】:

    使用 sed:

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

    【讨论】:

    • 想解释一下吗?
    • @DanMan,添加了一些解释
    • 当我尝试这个时,我得到“意外的 EOF(待处理的 })
    【解决方案2】:

    这显示了如何使用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:
    

    【讨论】:

    • I'm using UnxUtils in Windows, so unfortunately I don't have awk
    • 这也很有效,感谢您的帮助和关于 Gawk for Windows 的提示
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多