我知道你已经解决了这个问题,但是大多数unix机器都有一个perl解释器,并且该语言有一个内置模块,可以用这种分隔符完成解析文本的艰巨工作,它是Text::Balanced
. 这里有一个测试:
假设这个随机文本(取自问题:-),在花括号之间添加了一些文本并保存为infile
文件:
I am trying to extract {everything between braces} from a text file and
write the output to another text file. I was able to {construct a regular
expression} to match everything between {} and it works fine (I wrote a
simple {java program} to test it) but I not {very strong} in unix hence not
sure how to use this regular expression in unix.
程序script.pl
:
#!/usr/bin/env perl
use warnings;
use strict;
use Text::Balanced qw<extract_bracketed>;
my $str = do { undef $/; <> };
while ( my @result = extract_bracketed( $str, '{}', '[^{]*' ) ) {
last unless defined $result[0];
$result[0] =~ s/\n//g;
$result[0] = substr $result[0], 1, length( $result[0] ) - 2;
printf qq|%s\n|, $result[0];
}
读取变量中的整个文件并解析它以寻找一对花括号,因为每个循环都将其中@result
的文本保存在数组的第一个位置,因此我删除任何换行符、前导和尾随花括号并打印它。
像这样运行它:
perl script.pl infile
这会产生:
everything between braces
construct a regular expression
java program
very strong
请注意,它正确解析了第三行中的空白对。还有其他在其中包含换行符(第二行)并且在同一行中有多个时,例如在第四行中。