匹配模式并将下面的两行连接到一行

时间:2018-01-05 11:06:08

标签: bash awk sed

我有一个不规则的文件,当我看到 net 时我想加入3行,然后加入接下来的两行

abscc.tech.com
________
________
eaaa.bang.com
________
________
pop.wow.com
________
net self 10.47.250.189 
    address 10.47.250.189/29
    vlan trust_f5_1293
net self 10.47.96.12 
    address 10.47.96.12/24
    vlan vips_inline_1096
________
yuum.bean.com
________

结果应为

abscc.tech.com
________
________
eaaa.bang.com
________
________
pop.wow.com
________
net self 10.47.250.189 address 10.47.250.189/29 vlan trust_f5_1293
net self 10.47.96.12 address 10.47.96.12/24 vlan vips_inline_1096
________
yuum.bean.com
________

我试过

awk '/net/{if (NR!=1)print "";next}{printf $0}END{print "";}' file.txt

但它只是从第一个'网'开始,然后变成了傻瓜。

3 个答案:

答案 0 :(得分:2)

您可以使用awk来匹配以net开头的行,使用getline()获取下两行并在打印时打印其他两行默认。

awk '/^net/ { getline first; getline second; 
              sub(/^[[:space:]]+/,"",first); 
              sub(/^[[:space:]]+/,"",second); 
              printf "%s %s %s\n",$0, first, second; next }{ print }' file

答案 1 :(得分:2)

$ awk '/^net/{c=3} c&&c--{sub(/^ +/," "); rec=rec sep $0; if (c>0) next; $0=rec; rec=""} 1' file
abscc.tech.com
________
________
eaaa.bang.com
________
________
pop.wow.com
________
net self 10.47.250.189 address 10.47.250.189/29 vlan trust_f5_1293
net self 10.47.96.12 address 10.47.96.12/24 vlan vips_inline_1096
________
yuum.bean.com
________

如果您需要加入50行而不是3行,请将3替换为50。考虑如何使用其他答案来做到这一点。对目标文本块进行进一步操作,引入错误检查,将该块重定向到不同的文件或执行其他任何操作也是微不足道的。

答案 2 :(得分:1)

使用sed的另一种方法:

sed -e '/^net/{N;s/\n//;N;s/\n//;}'档案

它搜索模式,以'net'开头,^net

带来下一行N

删除嵌入的换行符s/\n//

为了删除两个新行,它执行两次相同的操作。