如何为文件中匹配的每行文本打印注释?

时间:2017-02-01 05:56:54

标签: perl

我正在尝试匹配匹配expressions.txt的所有文件中名为*main_log的文件中的关键字/文本/行。找到匹配项后,我想打印匹配的每一行的注释。

有没有更好的方法来打印?

expression.txt
Hello World ! # I want to print this comments#
Bye* #I want this to print when Bye Is match with main_log#
:::
:::

以下是我使用的代码:

{
    open( my $kw, '<', 'expressions.txt' ) or die $!;
    my @keywords = <$kw>;
    chomp( @keywords ); # remove newlines at the end of keywords

    # get list of files in current directory
    my @files = grep { -f } ( <*main_log>, <*Project>, <*properties> );

    # loop over each file to search keywords in
    foreach my $file ( @files ) {

        open( my $fh, '<', $file ) or die $!;
        my @content = <$fh>;
        close( $fh );

        my $l = 0;

        foreach my $kw ( @keywords ) {

            my $search = quotemeta( $kw ); # otherwise keyword is used as regex, not literally

            #$kw =~ m/\[(.*)\]/;
            $kw =~ m/\((.*)\)/;
            my $temp = $1;
            print "$temp\n";

            foreach ( @content ) { # go through every line for this keyword
                $l++;
                printf 'Found keyword %s in file %s, line %d:%s'.$/, $kw, $file, $l, $_ if /$search/;
            }
        }
    }

我尝试使用此代码打印括号(...)中提到的注释,但它不是以我想要的方式打印,如下所示:

如果expression.txt包含

Hello World ! # I want to print this comments#

如果Hello World !字符串在我的名为main_log的文件中匹配,那么它应仅与Hello World!中的main_log匹配,而是打印# I want to print this comments#作为用户评论了解关键字。

这些关键字可以是任意长度或包含任何字符。

虽然我已经使用了perl -w Test.pl&gt;但它工作正常,但是对将所需输出打印到文件中有点疑问命令提示符下的my_output.txt命令不确定如何使用perl脚本本身

open( my $kw, '<', 'expressions.txt') or die $!;
my @keywords = <$kw>;
chomp(@keywords); # remove newlines at the end of keywords


# post-processing your keywords file
my $kwhashref = {
  map {
    /^(.*?)(#.*?#)*$/;
    defined($2) ? ($1 => $2) : ( $1 => undef )
  } @keywords
}; 


# get list of files in current directory
my @files = grep { -f } (<*main_log>,<*Project>,<*properties>);


# loop over each file to search keywords in
foreach my $file (@files) {
  open(my $fh, '<', $file) or die $!;
  my @content = <$fh>;
  close($fh);
  my $l = 0;
  #foreach my $kw (@keywords) {

  foreach my $kw (keys %$kwhashref) {
    my $search = quotemeta($kw); # otherwise keyword is used as regex, not literally
    #$kw =~ m/\[(.*)\]/;
    #$kw =~ m/\#(.*)\#/;
    #my $temp = $1;
    #print "$temp\n";

    foreach (@content) { # go through every line for this keyword
      $l++;
      if (/$search/)
      {

      # only print if comment defined
      print $kwhashref->{$kw}."\n" if defined($kwhashref->{$kw}) ;    
      printf 'Found keyword %s in file %s, line %d:%s'.$/, $kw, $file, $l, $_
      #printf '$output';

      }


    }
  }
}

2 个答案:

答案 0 :(得分:1)

您的示例代码的大括号{ ... }不匹配,无法编译。

如果要在代码末尾添加另一个右括号,那么它将编译,但行

 $kw =~ m/\((.*)\)/;

永远不会成功,因为expressions.txt中的任何地方都没有括号。如果匹配未成功,则$1的值将从最近成功的正则表达式匹配操作中保留

您还尝试根据从expressions.txt检索到的所有行搜索文件中的行,此时您应将这些行拆分为关键字及其相应的注释

答案 1 :(得分:0)

这似乎是对你的另一个问题answer的后续跟进。我在最后一段中尝试建议的内容将在您的代码的前三行之后开始:

# post-processing your keywords file
my $kwhashref = {
  map {
    /^(.*?)(#.*?#)*$/;
    defined($2) ? ($1 => $2) : ( $1 => undef )
  } @keywords
}; 

现在,您在hashref中包含关键字,其中包含要作为键搜索的实际关键字,并将注释作为值(如果存在)(在此处使用行末尾语法#comment#)。

你的关键字循环现在必须使用keys %$kwhashref,你现在还可以在内循环中打印注释,转换如我链接的答案所示。附加印刷品:

print $kwhashref->{$kw}."\n" if defined($kwhashref->{$kw}); # only print if comment defined