【问题标题】:Perl - want to extract the lines between a patternPerl - 想要提取模式之间的线条
【发布时间】:2015-12-03 17:39:57
【问题描述】:

我有一个这样的文本文件

< MSSQLSTART >

select metric,value,Date 
from temp1

< MSSQLEND >

< MYSQL-START >

select metric,value,Date 
from temp1

< MYSQL-END >

现在我想提取特定标签之间的行。从技术上讲,希望从文件中提取这两个 sql 查询并执行这些查询并将结果保存到单独的文件中并比较两个结果。

如果有人可以帮助我在 perl 中编写代码,那将非常有帮助

我尝试使用以下代码提取行,但如果字符串匹配但行之间不匹配,它会打印整个文件...

use strict;
use warnings;

undef $/;        
open (FILE, '<', 'input.txt') or die "Could not open file: $!";

while (<FILE>) {
  print $_ if /<MSSQLSTART>/../<MSSQLEND>/;
}

【问题讨论】:

    标签: perl file


    【解决方案1】:

    你为什么undef $/?它一次加载整个文件。如果要逐行处理文件,请不要触摸变量。

    如果要提取不带标签的行,可以查看触发器操作符返回的值:它返回从 1 开始的行数,最后一行的编号附加了E0:

    while (<FILE>) {
        my $i = /< MYSQL-START >/ .. /< MYSQL-END >/;                                             # SO syntax highlighting bug /
        if ($i && $i != 1 && $i !~ /E0$/) {
            print;
        }
    }
    

    【讨论】:

    • 设置$i 在这种情况下有什么作用?你不能只用范围运算符来做吗?
    • @Sobrique:我想不出一种方法来检查范围运算符是否不同于 1 并且不会一步以 E0 结尾。
    • @Sobrique: print if (/&lt; MYSQL-START &gt;/ .. /&lt; MYSQL-END &gt;/) !~ /(?:^1?|E0)$/; 有效,但不可读。
    【解决方案2】:

    这是一种方法:

    use warnings;
    use strict;
    
    open my $fh, "<", "abc.txt" or die "Could not open file: $!";
    
    while (<$fh>) {
        if (/< .*START >/../< .*END >/)
        {
            print $_ unless /< .*START >/ or /< .*END >/;
        }
    }
    

    输出:

    select metric,value,Date 
    from temp1
    
    
    select metric,value,Date 
    from temp1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-13
      • 2014-03-13
      • 1970-01-01
      • 2016-12-19
      • 2018-06-08
      • 1970-01-01
      • 1970-01-01
      • 2019-09-28
      相关资源
      最近更新 更多