2010-07-01 3 views
3

는 내가 명령 실행이 실패했습니다 누구를 위해 이들의 이름과 나이를 추출해야어떻게 sed와 같이 perl을 사용합니까?

--ERROR--- Failed to execute the command with employee Name="shayam" Age="34" 

--Successfully executed the command with employee Name="ram" Age="55" 

--ERROR--- Failed to execute the command with employee Name="sam" Age="23" 

--ERROR--- Failed to execute the command with employee Name="yam" Age="3" 

같은 일부 항목이있는 파일이 있습니다. 이 경우에는 shayam을 추출해야합니다. 34 sam 23 yam 3. 나는 perl에서 이것을 할 필요가 있습니다. 고마워. 많이 ..

답변

6

제목은 분명하지 않다. 어쨌든 ...

while(<>) { 
next if !/^--ERROR/; 
/Name="([^"]+)"\s+Age="([^"]+)"/; 
print $1, " ", $2, "\n"; 
} 

stdin에서 읽을 수 있습니다. 물론, 읽기 루프를 다른 것으로 변경할 수 있으며 해시 또는 원하는대로 인쇄하기 위해 무언가를 인쇄 할 수 있습니다.

+1

감사합니다. 많은 형제 .. 인생에서 당신을 잊지 않을 게요. 고마워 .. – Raj

+1

어떤 의미에서 이것은 sed와 같은 펄을 사용하고 있습니까? _perl_과 같이 perl을 사용하고 있습니다. 아래의 다른 답변에서 호출을 선호합니다. –

+0

당신이 선호하고, 나는 관심을 가져야한다 ... OP가 당신과 의견이 맞지 않는다. 그러면이 문제가 닫히고 당신의 의견이 부적절하다고 표시된다. 더구나 당신 앞에서 다른 사람들처럼, 당신은 제목에서 OP가 사용하는 "sed와 같은"표현의 문자 적 ​​의미가 아니라 더 넓고, 약하고, 느슨한 것을 이해하지 못했을 것입니다. 내 잘못이 아니야. 모든 대답은 언제나 더 잘 만들어졌지만, OP는 빨리 끝났으므로 나에게는 끝났어. 다른 요구는 더 나은 (당신의 겸허 한 의견으로) 답으로 만족할 수 있습니다. (복잡한 편집은 oneliner로 수행하기가 어려울 수 있기 때문에 종종 sed'-f'를 사용했습니다. perl과 같은 sed를 사용 했습니까?) – ShinTakezou

-2

댓글을 참조하십시오 : 한 - 라이너로

my @a = <>; # Reading entire file into an array 
chomp @a; # Removing extra spaces 
@a = grep {/ERROR/} @a; # Removing lines that do not contain ERROR 
# mapping with sed-like regexp to keep only names and ages : 
@a = map {s/^.*Name=\"([a-z]+)\" Age=\"([0-9]+)\".*$/$1 $2/; $_} @a; 
print join " ",@a; # print of array content 
+1

모든 것을 하나의 배열로 읽고 나서 처리하는 것을 권장합니다. 줄 단위로 읽으십시오. –

+0

매튜 너를 위해서 가져 가지 말아라.하지만 왜 물어 봐도 될까요? –

+0

RAM보다 큰 파일이 있으면 시스템이 중단됩니다. 그래서 이유가 있습니다. 하지만 더 중요한 것은 배열에 전체 파일을 저장할 필요가 없다는 것입니다. * 단일 변수에 현재 행을 저장하면 충분합니다. 그렇지 않니? :) 또는 최고, 그냥 $ _를 사용하십시오. –

17

: 한 라이너로

perl -lne '/^--ERROR---.*Name="(.*?)" Age="(.*?)"/ && print "$1 $2"' file 
+0

어쩌면 비슷한 대답입니다! – daotoad

+0

감사합니다! 그것은 정말로 sed의 직접적인 대용품입니다. – akostadinov

5

, 시도 :

perl -ne 'print "$1 $2\n" if /^--ERROR/ && /Name="(.*?)"\s+Age="(.*?)"/;' 

이가 나오지 사용하여 같은 많은입니다, Perl 구문을 사용합니다.

2

"어떻게 sed와 같은 perl을 사용합니까?" s2p, sed to perl 변환기가 가장 잘 응답합니다. 커맨드 라인 "sed $ script"가 주어지면 "s2p $ script"를 호출하여 주어진 명령 세트에 대해 sed를 에뮬레이트하는 (일반적으로 읽을 수없는) perl 스크립트를 생성합니다.

펄 -pi -e '의 /../../ g'

+0

s2p는 더 이상 perl과 함께 제공되지 않지만 모듈 [App :: s2p] (https://www.metacpan.org/module/App::s2p)에서 가져올 수 있습니다. –

8

펄 -p -e의 /../../ g '대체

파일 또는 인라인 파일

관련 문제