【问题标题】:perl Combine each two line into one line in a fileperl 将每两行合并成一个文件中的一行
【发布时间】:2014-09-06 02:06:16
【问题描述】:

我有一个示例文本文件包含键值对的记录,但第一行中的第一个键在第二行中的值,然后第三行中的第二个键在第四行中的值,

例如,sample.conf 在一行中

key1
value1
key2
value2
key3
value3
...
and so on 

我需要把它转换成

key1 = value1 
key2 = value2

or it may be 

key1    key2.........
value1  value2.....

请帮助我,我是 perl 的初学者,非常感谢您的回答。

【问题讨论】:

    标签: perl


    【解决方案1】:

    使用 perl 单行;为每个奇数行删除换行符,并在每个偶数行的开头添加=

    perl -pe 'if ($. %2){ chomp }else{ s/^/ = / }' file
    

    使用类似的方法,

    perl -pe 'chomp; $_ .= " = ". <>' file
    

    输出

    key1 = value1
    key2 = value2
    key3 = value3
    

    或使用脚本,

    use strict;
    use warnings;
    use autodie;
    
    open my $fh, "<", "file";
    while (<$fh>) {
      if ($. %2){ chomp } else { s/^/ = / }
      print;
    }
    

    【讨论】:

    【解决方案2】:
    use warnings;
    use strict;
    
    while (my $k = <DATA>) {
    
      chomp $k;
      my $v = <DATA>;
    
      print "$k = $v";
    
    }
    
    __DATA__
    key1
    value1
    key2
    value2
    key3
    value3
    

    【讨论】:

    • 我想你打算把print 变成say
    • 其实不是,我只想要$v 后面的换行符,而我没有chomp $v。我当然可以chomped $v 然后 $k = $v。但是use feature 'say'; 是多余的;
    • 啊,是的。你是对的,当然。我知道有些地方不太对劲 - 是 use feature
    【解决方案3】:

    使用 perl 单行:

    perl -pe 's/\n/ = / if $. % 2' file
    

    说明:

    开关

    • -p:为输入文件中的每个“行”创建一个 while(&lt;&gt;){...; print} 循环。
    • -e:告诉perl 在命令行上执行代码。

    代码

    • s/\n/ = /:用空格分隔的等号替换换行符...
    • if $. % 2:仅在奇数行上。

    使用脚本:

    use strict;
    use warnings;
    use autodie;
    
    #open my $fh, '<', "file";  # To replace below line when not testing
    my $fh = \*DATA;
    
    while (<$fh>) {
        s/\n/ = / if $. % 2;
        print;
    }
    
    __DATA__
    key1
    value1
    key2
    value2
    key3
    value3
    

    输出:

    key1 = value1
    key2 = value2
    key3 = value3
    

    【讨论】:

      猜你喜欢
      • 2013-01-21
      • 1970-01-01
      • 1970-01-01
      • 2020-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-13
      • 2012-04-30
      相关资源
      最近更新 更多