파일에서 특정 문자열이 발견될 때마다 특정 수의 줄을 삭제하는 방법

파일에서 특정 문자열이 발견될 때마다 특정 수의 줄을 삭제하는 방법

파일에서 문자열이 발견될 때마다 처음 1줄과 마지막 10줄을 삭제하고 싶습니다.

foo.txt:

} Name: john Line 3 Line 4 Line 5 Line 6 Line 7 Line 8 Line 9 Line 10 Line 11 Line 12 Apple orange grape pine } Name: Ruben Line Line Line Line Line Line Line Line Line Line grape zebra donkey } Name: Tom Line Line Line Line Line Line Line Line Line Line Tiger red blue orange tomato cat }

예상하다 Out.txt:

Name: john Apple orange grape pine Name: Ruben grape zebra donkey Name: Tom Tiger red blue orange tomato cat

sed또는 중괄호와 Name: nawk뒤의 다음 10줄을 없애고 싶습니다 . Solaris 5.10과 ksh.

답변1

awk를 사용하세요

$ awk '/}/{next;} /Name:/{print;n=NR+10} NR>n' file
Name: john
Apple
orange
grape
pine
Name: Ruben
grape
zebra
donkey
Name: Tom
Tiger
red
blue
orange
tomato
cat

어떻게 작동하나요?

  • /}/{next;}

    포함을 건너뜁니다 }.

  • /Name:/{print;n=NR+10}

    포함하는 줄에 도달하면 인쇄한 다음 10에 현재 줄 번호를 더해 설정하여 Name:언제 다시 인쇄를 시작할지 알 수 있습니다.n

  • NR>n

    현재 줄 번호가 보다 크면 n기본 작업이 수행됩니다: 줄을 인쇄합니다.

sed 사용

매우 유사한 논리를 사용합니다.

$ sed -e '/}/d' -e '/Name:/{p;N;N;N;N;N;N;N;N;N;N;d;}' file
Name: john
Apple
orange
grape
pine
Name: Ruben
grape
zebra
donkey
Name: Tom
Tiger
red
blue
orange
tomato
cat

어떻게 작동하나요?

  • /}/d

    포함된 내용을 모두 제거하세요 }.

  • /Name:/{p;N;N;N;N;N;N;N;N;N;N;d;}

    포함된 줄을 찾으면 Name:인쇄한 후 다음 10줄을 읽고 삭제합니다.

위의 카테고리 중 어느 것에도 속하지 않는 라인을 인쇄합니다.

관련 정보