あなたがすでに質問を解決していることは知っていますが、ほとんどの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
3 行目の空白のペアが正しく解析されることに注意してください。また、内部に改行がある場合 (2 行目) と、4 行目のように同じ行に複数ある場合もあります。