2

ファイルをスキャンして特定の文字列を含む行を探し、その行を別のファイルに出力しようとしています。

ただし、空白を無視して、文字列を含む行が "," で終わる ")" 文字まで複数行を出力する必要があります。

現在、私は使用しています

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

ここで、 $func には探している文字列が含まれていますが、もちろん制限のために機能しません。

これを行う方法はありますか?現在は bash を使用していますが、perl でも問題ありません。ありがとう。

4

2 に答える 2

0

制限が正確ではないため、質問は難しいです。ブロックは次のように見えるべきだとあなたは言います - 私が思うに -

foo,
bar,
baz)

ブロックを開始する文字列はどこfooにあり、閉じ括弧はブロックを終了します。ただし、次のように言うこともできます。

foo bar baz) xxxxxxxxxxx,

そして、行がカンマで終わる IFまでのみ印刷)したいのです。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

あなたが最初の選択肢を意味しているとしか推測できないので、2つのオプションを示します。

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

2 つ目は、両方の制限を考慮し、両方に一致しないブロック内の行が見つかった場合に警告する (STDERR に出力する) 単純化された if 構造です。

于 2012-05-29T00:45:14.507 に答える