2013-10-07 3 views
0

입력 파일을 제거하지 않고 다음 라인 출력을 기대펄 라이너 한 여러 광고를

<section_begin> mxsqlc 


*** WARNING[13052] Cursor C is not fetched. 
<section_end> 
<section_begin> b2.lst 
* 


*** WARNING[13052] Cursor C is not fetched. 

0 errors, 1 warnings in SQL C file "b2.ppp". 
<section_end> 
<section_begin> b2s0 
SQLCODE=0 
SQLSTATE=00000 
a=10, b=abc, c=20 
SQLCODE=0 
SQLSTATE=00000 
a=10, b=abc  , c=10, d=xyz  
<section_end> 

이다.

<section_end> 
<section_begin> b2s0 

내 코드는 모든 <section_end> 라인을 제거하고 보관이 줄을 <section_begin> *.lst

+4

일치하지 않으므로? 어쩌면 당신은'/^ (\ s * |. * lst)? \ s * $/i'을 원할 것입니다. – Qtax

+0

또는 더 제한적인'/^

​​| begin>. * \. lst) \ s * $ /'일 수 있습니다. –

+0

나는 이것을 사용했다. 하지만 행운을 빌어 요 --ne '인쇄하지 않는 한 /^(\s*|.*lst)?\s*$/i'b2exp는 을 반환합니다 mxsqlc *** 경고 [ 13052] 커서 C가 반입되지 않습니다. * *** 경고 [13052] 커서 C를 가져 오지 않았습니다. SQL C 파일 "b2.ppp"에서 0 개의 오류, 1 개의 경고. <에는 section_begin> SQLCODE b2s0 = 00000 A = 10, B = ABC, C = 10, D = XYZ = 0 SQLSTATE = 00000 A = 10, B = ABC, C = 20 SQLCODE = 0 SQLSTATE.는 – user2347191

답변

1

을 제거하지 않습니다

perl -ne 'print unless /^\<section_end\>(\s*|.*lst)?\s*$/' b2exp 

입니다 그것은 간단한

perl -ne 'print unless /^\<section_/' b2exp 

좀 더 복잡

perl -ne 'print unless /^\<section_(end|begin)\>/' b2exp 

아, 질문이 명확하지 않습니다.

내가 지금 말을 시작할 때 <section_begin> tagname</section_end>와 나는 밖으로 표시가 일부 섹션이 " 으로 그것을 읽고 (나에게, 아마도 정말입니다.) 내가 특정 태그 이름으로 섹션을 제외 할 , 이 예에서 bs20는. 나는 다른 모든 라인을 유지하고자하는 "의도는 다음 섹션 lst와 섹션을 병합 (그리고 다음 섹션의 시작 태그 후 같은 줄에 물건을 제거하는 경우

perl -ne 'BEGIN {$p=1} $p=0 if /section_begin.*b2s0/; print if $p; $p=1 if /<section_end>/;' ex.txt 
+0

기대 출력'이다 :(누락 <에는 section_begin> mxsqlc 경고 ​​ *** [13,052]는 커서 C 페치 아니다. * 경고 *** [13,052] 커서 C하지 페치. 0 오류, SQL의 C 파일 "b2.ppp"1 경고. <에는 section_begin> SQLCODE b2s0 = 0 SQLSTATE = 00000 A = 10, B = ABC, C = 20 SQLCODE = 0 SQLSTATE = 00000 a = 10, b = abc, c = 10, d = xyz ' – user2347191

0

), 나는 대신 Awk와 함께 갈 것이다.

awk '/<section_end>/ && lst { next } 
    /<section_begin>/ && lst { lst=0; next } 
    /<section_begin>.*lst/ {lst=1} 
    1' b2exp 

물론 Perl에서 동일한 작업을 수행 할 수 있습니다. perl -0777 -pe 's/.../.../s' file의 가장 단순한 한 줄 짜기는 버퍼링으로 인해 메모리 효율이 훨씬 떨어집니다.

perl -0777 -pe 's%(<section_begin>[^\n]*lst.*?)\n<section_end>\n<section_begin>[^\n]%$1%s' b2exp 

메모리 ( -0777)에 전체 파일을 읽고 멀티 라인 정규 표현식을 대체합니다. 탐욕스러운 일치 .*?은 가능한 한 짧게합니다. 즉, 나머지 패턴 (개행 문자, 종료 태그, 개행 문자, 선택적으로 비 개행 문자 뒤에 오는 시작 태그)에 일치하지 않습니다. 또한 플래그는 /s 플래그가 .이 줄 바꿈과 일치 할 수있는 와일드 카드로 바뀌므로 같은 줄에 일치하는 항목을 유지하려고합니다.