두 패턴 사이의 선을 선택적으로 제거

두 패턴 사이의 선을 선택적으로 제거

다음 내용이 포함된 파일이 있습니다.

Hello world Unix!!
Its bright world
Current time is HH:mm:ss
Next action plan is item #3
End of task.
Thank you.


Hello world Linux!!
All actions completed.
End of Activity.
Thanks.

"활동" 또는 "작업"과 같은 특정 키워드 집합이 포함된 행이 나타날 때까지 "세계"라는 키워드가 포함된 모든 행과 모든 후속 행을 선택적으로 삭제하고 싶습니다.

원하는 출력:

End of task.
Thank you.
End of Activity.
Thanks. 

답변1

노력하다:

$ awk  -v f=1 '/world/{f=0} /Activity|task/{f=1} f' File
End of task.
Thank you.


End of Activity.
Thanks.

작동 방식:

  1. -v f=1

    awk 변수를 f만들고 1.

  2. /world/{f=0}

    현재 행에 이 포함되어 있으면 world변수는 f0으로 설정됩니다.

  3. /Activity|task/{f=1}

    행에 Activity또는 이 포함된 경우 로 task설정됩니다 .f1

    world위와 Activity/또는 task여기가 정규식으로 처리된다는 점에 유의하세요 . 또한 대소문자를 구분합니다.

  4. f

    f0이 아닌 경우 해당 행을 인쇄합니다.

빈 줄도 삭제하세요

$ awk  -v f=1 '/world/{f=0} /Activity|task/{f=1} f && /./' File
End of task.
Thank you.
End of Activity.
Thanks.

f && /./f0이 아닌 경우에만 행을 인쇄하도록 awk에 지시합니다.그리고행에는 모든 유형의 문자가 하나 이상 포함되어 있습니다.

답변2

awk 솔루션만큼 예쁘지는 않지만 OP가 질문에 다음과 같은 태그를 지정했기 때문에sed다시 한 번 말씀드리자면 다음과 같습니다.

#with blank lines
sed '/world/,/task\|Activity/{//!d};/world/d' file

#without blank lines
sed '/world/,/task\|Activity/{//!d};/world\|^$/d' file

//사용하기 전에 정규식 사용을 주의하세요 :)

관련 정보