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.

텍스트가 Regex와 1 라인에 있으면이 작업을 수행하는 방법을 알고 있습니다. 그러나 나는 여러 줄로 그것을하는 방법을 모른다. 궁극적으로 구성 파일의 매개 변수화 된 파일을 생성 할 수 있도록 템플릿의 일부를 조건부로 삭제할 수 있어야합니다. 나는 Perl이 좋은 언어라고 생각했지만 여전히 그것의 교수형을 받고 있습니다.

편집하다: <>의 인스턴스가 1 개 이상 필요합니다.

도움이 되었습니까?

해결책

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

다른 팁

PERL 모듈을 확인할 수 있습니다 텍스트 :: 균형, 핵심 분포의 일부. 나는 그것이 당신에게 도움이 될 것이라고 생각합니다. 일반적으로, 주제 텍스트에 내부 구분 장치 세트가있을 가능성이 있다면, 매우 지저분해질 수 있다면, 이런 종류의 일을하지 않기를 원합니다.

Perl에서 :

#! /usr/bin/perl   
use strict;

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

REGEX는 <through the first> (포함)로 시작하는 모든 것을 대체하고 아무것도 대체합니다. G는 글로벌입니다 (두 번 이상).

편집 : Hynek 및 Chaos의 코멘트

비효율적 인 원 라이너 방식

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

프로그램과 동일합니다

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

여기에서 변환하려는 큰 텍스트가 얼마나 효과적인 1 라이너 소비 라인별로 소비되는 방법에 따라 다릅니다.

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