Perl:仅在与某个正则表达式匹配的行上打印引号之间的字符串

时间:2015-07-25 22:02:39

标签: regex perl parsing text-parsing string-parsing

编辑:我不只是试图征求人们为我编写此代码.....我已经尝试了大约一天,尽管有一本perl教科书,我仍然可以& #39;弄清楚。就像我说的那样,我可以使用grep / awk / sed,也可以通过将多个perl单行连接在一起....我只是无法弄清楚如何在一个perl调用中执行它。

我是Perl的新手,所以这个很容易回答。

我正在尝试编写一个脚本,该脚本将逐行解析文件并在引号之间的行上打印第一个单词,但在包含引号的行上打印 EOL中的特定字符串(字符串作为参数传递)。 C头文件中的文件以及其中的许多其他垃圾包含下面格式的结构定义,其中包含我想要提取的字符串。

struct Foo_t foo
{

    /* str_HELLO */
    { {5,4,8,7,9},
      {     "HELLO!",      // English 
            "BONJOUR!",    // French
            "Hallo!",       // German 
            "BONJOURNO!",   // Italian
            "HOLA!"         // Spanish
    } }, 

    /* str_GOODBYE */
    { {15,3,3,3,3},
      {     "GOODBYE!",     // English 
            "AU REVOUIR!",   // French
            "TSCHUSS!",      // German 
            "CIAO!",         // Italian
            "ADIOS!"      // Spanish
    } }, 


    /* str_FOO */
    { {15,3,3,3,3},
      {     "FOO",      // English 
            "BAR",      // French
            "NOO",      // German 
            "BAZ",      // Italian
            "OOF"       // Spanish
    } },


    // lots more of these....
    // .... 

为了获得所需的输出,我希望调用

bash~$: myscript.pl -language=english file_to_be_parsed.h 

我可以通过将greps连接在一起来轻松完成此操作,但我真的想在perl中使用它。我试图通过一个脚本和一个单行程来完成这个简单的任务,但没有一个有效。由于这是如此之快,如果任何perl向导可以向我展示光线,以及匹配内容的解释,我将非常感激。

提前致谢!!

3 个答案:

答案 0 :(得分:1)

v5.22的实验性功能是code evaluation expressions。如果成功,您可以从正则表达式中执行代码。结合积极的前瞻,你得到了这个:

/"(.*?)".*(?=english)(?{print "$1\n";})$/i;

答案 1 :(得分:0)

来自@melomene的评论在评论中做了伎俩。

我从

开始
perl -wnle '/english/i and ($_ =~ /\"(\w)*\"/ and print $&);' file.h | perl -wlne 's/[",]//g and print;' 

perl -wnle '/english/i and ($_ =~ /\"(\w*)\"/ and print $1);` file.h

答案 2 :(得分:0)

这样的事情是对您自己的解决方案的改进。它应该被称为

perl filter_header.pl english header.h
use strict;
use warnings;

open my $fh, '<', $file or die qq{Unable to open "$file" for input: $!};

while ( <$fh> ) {
  next unless m| // \s* \Q$lang |ix;
  print $1, "\n" if / " ([^"]*) " /x;
}

输出

HELLO!
GOODBYE!
FOO