我正在尝试扫描文件以查找包含特定字符串的行,并将这些行打印到另一个文件。
但是,如果包含以“,”结尾的字符串的行忽略空格,我需要打印多行直到“)”字符。
目前我正在使用
for func in $fnnames
do
sed/"$func"/p <$file >>$CODEBASEDIR/function_signature -n
done
其中 $func 包含我要查找的字符串,但当然它不适用于限制。
有没有办法做到这一点?目前使用 bash,但 perl 也很好。谢谢。
perl -ne 'print if 1 .. /\).*,\s*$/'
您的问题很棘手,因为您的限制不准确。你说 - 我认为 - 一个块应该是这样的:
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)。