에 패턴 후 줄을 제거 I가 다음 명령여러 파일
find ./ -type f -exec perl -pi -e 's/<pattern>//g' '{}' \;
가 잘 작동하고 패턴을 제거 할 수 있지만 어떻게, 그것은에있는 라인 패턴을 제거 할 수 있습니다, 이후 n
라인? 그래서, 우리는 bbb
에서 ccc
에 제거 할 지금
aaa
bbb
ccc
ddd
eee
fff
:
에 패턴 후 줄을 제거 I가 다음 명령여러 파일
find ./ -type f -exec perl -pi -e 's/<pattern>//g' '{}' \;
가 잘 작동하고 패턴을 제거 할 수 있지만 어떻게, 그것은에있는 라인 패턴을 제거 할 수 있습니다, 이후 n
라인? 그래서, 우리는 bbb
에서 ccc
에 제거 할 지금
aaa
bbb
ccc
ddd
eee
fff
:
그것은 우아한 것보다 더 무차별 적입니다. 그러나 이것은 matchin과 함께 라인을 제거 할 것이라고 생각합니다. g 패턴과 그 뒤 따르는 라인.
find ./ -type f -exec perl -i -e '$x=0 ; while (<>) {if ($_ =~ /<pattern>/) { $x++; next; }; if ($x) { $x=0; next; }; print "$_";}' {} \;
감사! 그래도 다음 네 줄을 지우고 싶습니다. 어떻게해야합니까? 나는'next'를 다른 것으로 바꿀 필요가 있다고 생각하니? – Nik
이것은 하나의 파일에 대한 펄 답변입니다. 나는 당신이 포장 한 find
가 숨겨진 파일을 편집 할 것임을 깨닫지 못하는이 질문을 발견 한 사람을 원하지 않습니다.
답변 :
perl -ni -e '$ml=$. if /<pattern>/; print unless (defined $ml && $.<=$ml+[n])' input-file
설명 :
perl -ni
읽고 input-file
을 대체하지만
$ml=$. if /<pattern>/
에 지시가있는 경우에만 인쇄 할 수는 $ml
일치하는 라인의 변수를 설정합니다일치하고, [N] 다음 라인
@Nik 다른 답변에 대한 귀하의 질문에 대답하기 위해 줄을 제거하는 해결책은 다음과 같습니다 :'find ./ -type f -exec perl -ni -e '$ ml = $. if/
캔 패턴은 각 파일에 두 번 이상 존재하는 라인을 제외한 모든 라인을 인쇄 할 입력 파일
print unless (defined $ml && $.<=$ml+[n])
의 전류 선이? 인스턴스를 2 개만 대체 하시겠습니까? – anubhava그것은 Perl과는 상관 없지만'find'를 가지고 있습니다 : _GNU find_를 사용한다면 'find ./ -type f -exec perl ...'{} '대신'find ./ -type f -exec perl ... '{}'\;'. '\; 대신'+'를주의하십시오. 'find'는 한 번에 여러 파일 이름을 갖는'perl '을 호출 할 것이고 (커맨드 라인에 맞는만큼) 전체 실행 시간을 대폭 단축시킬 것입니다. – PerlDuck
@PerlDog 감사합니다. 그것은 그것을 상당히 향상 시켰습니다. – Nik