Perl에서 <과> 사이에서 문자를 삭제하려면 어떻게해야합니까?
문제
파일로 읽으려면 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;
}
제휴하지 않습니다 StackOverflow