2

我正在尝试扫描文件以查找包含特定字符串的行,并将这些行打印到另一个文件。

但是,如果包含以“,”结尾的字符串的行忽略空格,我需要打印多行直到“)”字符。

目前我正在使用

for func in $fnnames
do
  sed/"$func"/p <$file >>$CODEBASEDIR/function_signature -n
done

其中 $func 包含我要查找的字符串,但当然它不适用于限制。

有没有办法做到这一点?目前使用 bash,但 perl 也很好。谢谢。

4

2 回答 2

0
perl -ne 'print if 1 .. /\).*,\s*$/'
于 2012-05-28T23:12:53.443 回答
0

您的问题很棘手,因为您的限制不准确。你说 - 我认为 - 一个块应该是这样的:

foo,
bar,
baz)

foo开始块的字符串在哪里,右括号结束它。但是,您也可以说:

foo bar baz) xxxxxxxxxxx,

而且您只想打印到),也就是说foo bar baz),如果行以逗号结尾。

可以说只应继续以逗号结尾的行:

foo,   # print + is continued
bar    # print + is not continued
xxxxx  # ignored line
foo    # print + is not continued
foo,
bar,
baz)   # closing parens also end block

由于我只能猜测您的意思是第一种选择,因此我给您两个选择:

use strict;
use warnings;

sub flip {
    while (<DATA>) {
        print if /^foo/ .. /\)\s*$/;
    }
}

sub ifchain {
    my ($foo, $print);
    while (<DATA>) {
        if (/^foo/) {
            $foo = 1;          # start block
            print;
        } elsif ($foo) {
            if (/,\s*$/) {
                print;
            } elsif (/\)\s*$/) {
                $foo = 0;      # end block
                print;
            }
            # for catching input errors:
            else { chomp; warn "Mismatched line '$_'" }
        }
    }
}


__DATA__
foo1,
bar, 
baz)
sadsdasdasdasd,
asda
adaffssd
foo2,   
two,    
three)
yada

第一个将打印在以 开头的foo行和以 结尾的行之间找到的任何行)。它将忽略“以逗号结尾的行”限制。从积极的方面来说,它可以简化为单行:

perl -ne 'print if /^foo/ .. /\)\s*$/' file.txt

第二个只是一个简单的 if 结构,它将同时考虑这两个限制,如果在块内发现一行与这两个限制都不匹配,则会发出警告(打印到 STDERR)。

于 2012-05-29T00:45:14.507 回答