2

我正在尝试从文本文件中提取大括号之间的所有内容并将输出写入另一个文本文件。我能够构造一个正则表达式来匹配 {} 之间的所有内容并且它工作正常(我编写了一个简单的 java 程序来测试它)但我在 unix 中不是很强大,因此不知道如何在 unix 中使用这个正则表达式。

下面的正则表达式匹配 {} 之间的所有内容(也适用于 jedit)

\{([^}]+)\}

我尝试了以下 sed 命令,

cat samplefile | sed -e 's/.*\{\([^}]+\)\}.*/\1/g'

我收到以下错误。

sed: -e expression #1, char 24: Invalid preceding regular expression

之间我找到了一个正则表达式来匹配 [] 之间的所有内容,并且效果很好。不知道我哪里出错了。有人可以帮我解决我的正则表达式问题吗?

cat file |sed -e 's/.*\[\([^]]*\)\].*/\1/g'

编辑1:

解决方案:

cat file | sed -e 's/.*{\([^}]\+\)}.*/\1/g'  --> works
4

2 回答 2

3

您必须转义 + 量词

于 2013-06-20T16:36:23.033 回答
1

我知道你已经解决了这个问题,但是大多数机器都有一个解释器,并且该语言有一个内置模块,可以用这种分隔符完成解析文本的艰巨工作,它是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

请注意,它正确解析了第三行中的空白对。还有其他在其中包含换行符(第二行)并且在同一行中有多个时,例如在第四行中。

于 2013-06-20T17:02:06.120 回答