2013-06-20 211 views
2

我想從文本文件中提取大括號之間的所有內容,並將輸出寫入另一個文本文件。我能夠構造一個正則表達式來匹配{}之間的所有內容,並且它工作正常(我編寫了一個簡單的java程序來測試它),但是我在unix中不是很強大,因此不確定如何在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 

回答

2

必須逃離+量詞

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裏面的文本,所以然後我刪除任何換行符,前導和尾隨的cu利用括號和打印它。

運行它喜歡:

perl script.pl infile 

即產率:

everything between braces 
construct a regular expression 

java program 
very strong 

注意,它正確地解析在第三行中空白對。另外還有一個在他們內部的換行符(第二行),當同一行中有多個時,就像第四行一樣。

相關問題