どのように私はPerlで、<と>の間の文字を削除することができますか?

StackOverflow https://stackoverflow.com/questions/737751

  •  09-09-2019
  •  | 
  •  

質問

私は、彼らが別の行にしている場合でも、ファイルを読み込むためにPerlスクリプトを書き、<>内の何も削除する必要があります。入力された場合それは、次のとおりです。

Hello, world. I <enjoy eating
bagels. They are quite tasty.
I prefer when I ate a bagel to
when I >ate a sandwich. <I also
like >bananas.

私は出力になりたいます:

Hello, world. I ate a sandwich. bananas.

私はテキストを正規表現で1本のライン上にある場合は、これを行う方法を知っています。しかし、私は複数の行でそれを行う方法がわかりません。 最終的に私は設定ファイルのためのパラメータ化ファイルを生成することができますので、条件付きテンプレートの一部を削除できるようにする必要があります。私はperlが良い言語だろうと思ったが、私はまだそれのこつを取得しています。

編集:また、以上の1つのインスタンスが必要<>

役に立ちましたか?

解決

local $/;
my $text = <>;
s/<.*?>//gs;
print $text;

他のヒント

あなたはPerlモジュールをチェックアウトすることができますテキスト::バランスに、一部コアディストリビューションの。私はそれがあなたのための助けになると思います。一般的に、人はそれが非常に厄介取得することができ、対象テキストが区切り文字の内側のセットを持っている可能性がある場合そういったことを行うために正規表現を避けたい。

Perlでます:

#! /usr/bin/perl   
use strict;

my $text = <>;
$text =~ s/<[^>]*>//g;
print $text;

正規表現は、<最初の経由>(包括的)から始まる何かを代入し、何に置き換えます。 Gは、(複数回)グローバルである。

EDIT:ハイネックと混沌から組み込まコメント

無効なワンライナーの道

perl -0777 -pe 's/<.*?>//gs'

プログラムと同じ

local $/;
my $text = <>;
s/<.*?>//gs;
print $text;

それはあなたがここに変換している線で、より効果的なワンライナーかかるライン

たいどのように大きなテキスト依存します
perl -pe 'if ($a) {(s/.*?>// and do {s/<.*?>//g; $a = s/<.*//s;1}) or $_=q{}} else {s/<.*?>//g; $a = s/<.*//s}'

プログラムと同じ

my $a;
while (<>) {
    if ($a) {
        if (s/.*?>//) {
            s/<.*?>//g;
            $a = s/<.*//s;
        }
        else { $_ = q{} }
    }
    else {
        s/<.*?>//g;
        $a = s/<.*//s;
    }
    print;
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top