Bash / perl从文件打印行直到具有条件的字符

时间:2012-05-28 22:30:06

标签: perl bash parsing

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

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

目前我正在使用

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

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

有办法做到这一点吗?目前使用bash,但perl也没关系。 感谢。

2 个答案:

答案 0 :(得分:0)

perl -ne 'print if 1 .. /\).*,\s*$/'

答案 1 :(得分: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)。