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

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

3 行目の空白のペアが正しく解析されることに注意してください。また、内部に改行がある場合 (2 行目) と、4 行目のように同じ行に複数ある場合もあります。

于 2013-06-20T17:02:06.120 に答える