转换可变数量的行,其中包含可变数量的行 然后是所有行直到下一个

问题描述 投票:-3回答:2

我有以下输入,涉及多接口(几十个)网络设备(请注意,#的行仅用于说明而不存在于数据中):

eth<number1> 
# eth as pattern is fine, running number will be dealt with
parameter1 parameter2 parameter3...parameterN 
#ellipsis means and so on and is not literal
parameter21 parameter22
parameter31 parameter32 parameter33 parameter34
parameter41
eth<number2>
parameter1 parameter2
parameter21
.
.
.
.
parameterN1 parameterN2  
# again, vertical ellipsis is not literal and means simply that rows 
# with parameters can go on and on, it is not known in advance for 
# how long
eth<number3>
parameter1 parameter2
eth<number4>
parameter1 parameter2
parameter21

所需的输出应如下所示:

eth<number1> parameter1 parameter2 parameterN parameter21 parameter22 parameter31 parameter32 parameter33 parameter34 parameter41 
# all in one line, with as many columns as there are parameters for 
# the given interface.
eth<number2> parameter1 parameter2....parameterNM
eth<number3> parameter1 parameter2
eth<number4> parameter1 parameter2 parameter21

任何想法如何用awksed完成它?当然,欢迎提出任何澄清问题。

perl awk sed text-processing
2个回答
2
投票

这可能适合你(GNU sed):

sed -E '/^#/d;/^eth/!{H;$!d};x;s/\n/ /gp;x;h;d' file

有三种情况:以#开头的行,以及以eth开头的行和其他行。

如果当前行是注释,请将其删除。

如果当前行没有开始eth,请将其附加到保留空间(HS)并删除它,除非它是最后一行。

否则,当前行开始eth或是最后一行,因此交换到HS,如果包含任何换行符,请用空格替换它们并打印结果。交换回模式空间并用当前行替换HS并删除当前行,除非它是文件的最后一行,在这种情况下打印它。


0
投票

这在Perl中应该很容易实现。 eth线很容易匹配,我们只想将它们之间的所有线组合成一条线。

#!/usr/bin/env perl
use strict;
use warnings;

my $collected;
while (my $line = <DATA>){
  next if $line =~ /^#/;
  if($line =~ /^eth/) {
    # new block of lines
    if ($collected) {
      print $collected, "\n";
      $collected = "";
    }
    chomp $line;
    $collected = $line;
  } else {
    # Append to collected lines
    chomp $line;
    $collected = "$collected $line";
  }
}
print $collected,"\n" if $collected;
__DATA__
eth<number1>
parameter1 parameter2 parameter3...parameterN
#ellipsis means and so on and is not literal
parameter21 parameter22
parameter31 parameter32 parameter33 parameter34
parameter41
eth<number2>
parameter1 parameter2
parameter21
parameterN1 parameterN2
eth<number3>
parameter1 parameter2
eth<number4>
parameter1 parameter2
parameter21

这将解析您的示例数据(忽略注释)并创建所需的输出。当然,这只是一个演示;你想要open数据所在的文件并阅读它:

open my $fh, "<", "your.data" or die "Can't open file: $!\n";
...
while(my $line = <$fh>) { 
...
© www.soinside.com 2019 - 2024. All rights reserved.