2016-10-11 2 views
0

에 패턴 후 줄을 제거 I가 다음 명령여러 파일

find ./ -type f -exec perl -pi -e 's/<pattern>//g' '{}' \; 

가 잘 작동하고 패턴을 제거 할 수 있지만 어떻게, 그것은에있는 라인 패턴을 제거 할 수 있습니다, 이후 n 라인? 그래서, 우리는 bbb에서 ccc에 제거 할 지금

aaa 
bbb 
ccc 
ddd 
eee 
fff 

:

+0

캔 패턴은 각 파일에 두 번 이상 존재하는 라인을 제외한 모든 라인을 인쇄 할 입력 파일

print unless (defined $ml && $.<=$ml+[n])의 전류 선이? 인스턴스를 2 개만 대체 하시겠습니까? – anubhava

+1

그것은 Perl과는 상관 없지만'find'를 가지고 있습니다 : _GNU find_를 사용한다면 'find ./ -type f -exec perl ...'{} '대신'find ./ -type f -exec perl ... '{}'\;'. '\; 대신'+'를주의하십시오. 'find'는 한 번에 여러 파일 이름을 갖는'perl '을 호출 할 것이고 (커맨드 라인에 맞는만큼) 전체 실행 시간을 대폭 단축시킬 것입니다. – PerlDuck

+1

@PerlDog 감사합니다. 그것은 그것을 상당히 향상 시켰습니다. – Nik

답변

1

그것은 우아한 것보다 더 무차별 적입니다. 그러나 이것은 matchin과 함께 라인을 제거 할 것이라고 생각합니다. g 패턴과 그 뒤 따르는 라인.

find ./ -type f -exec perl -i -e '$x=0 ; while (<>) {if ($_ =~ /<pattern>/) { $x++; next; }; if ($x) { $x=0; next; }; print "$_";}' {} \; 
+0

감사! 그래도 다음 네 줄을 지우고 싶습니다. 어떻게해야합니까? 나는'next'를 다른 것으로 바꿀 필요가 있다고 생각하니? – Nik

1

는 파일을 가지고

perl -i -0pe 's/bbb.*ccc//ms' file 

0 것이다 소리내어 먹는다 단락하여 파일 단락

+0

간단한 솔루션을 가져 주셔서 감사합니다. 그러나 한 번에 여러 파일에 사용할 수있는 기능을 찾고 있습니다. – Nik

+1

이'perl' cmd를 원래 find에 추가하십시오!?! –

+0

두 경우 모두 라인의 첫 번째 부분 만 제거합니다. 그래서's/aaabbeee. * eeecccfff // ms'이라면'eee'와'fff'를 한 줄에 넣을 것입니다. – Nik

0

이것은 하나의 파일에 대한 펄 답변입니다. 나는 당신이 포장 한 find가 숨겨진 파일을 편집 할 것임을 깨닫지 못하는이 질문을 발견 한 사람을 원하지 않습니다.

답변 :

perl -ni -e '$ml=$. if /<pattern>/; print unless (defined $ml && $.<=$ml+[n])' input-file

설명 :

perl -ni 읽고 input-file을 대체하지만

$ml=$. if /<pattern>/에 지시가있는 경우에만 인쇄 할 수는 $ml 일치하는 라인의 변수를 설정합니다일치하고, [N] 다음 라인

+0

@Nik 다른 답변에 대한 귀하의 질문에 대답하기 위해 줄을 제거하는 해결책은 다음과 같습니다 :'find ./ -type f -exec perl -ni -e '$ ml = $. if/ /; ($ ml && $. <= $ ml + 4로 정의하지 않는 한) '{} +' – stevesliva