我正在尝试扫描包含特定字符串的行的文件,并将这些行打印到另一个文件。
但是,我需要打印多行直到“)”字符如果包含字符串的行以“,”忽略空格。
目前我正在使用
for func in $fnnames
do
sed/"$func"/p <$file >>$CODEBASEDIR/function_signature -n
done
其中$ func包含我查找的字符串,但当然它不适用于限制。
有办法做到这一点吗?目前使用bash,但perl也没关系。 感谢。
答案 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)。